首页 > 代码库 > 单例模式之个人笔记(一)
单例模式之个人笔记(一)
概念理解:关于单例模式,顾名思义,就是单一的实例,也就是说,实例只有一个。比如一个公司只有一辆公家车,你出门开这辆车,别人出门也开这辆车,你们每次开的其实是同一辆车,车只有一辆,对应java就是,我调用的是这个实例,你调用的也是同一个实例,没有再new出新的实例,大家都用一个。
分为两类:懒汉式和饿汉式。
懒汉式:就是比较懒,只有调用的时候才会创建实例。
//懒汉模式
public class Singleton {
private Singleton(){}; //使用private私有化,使得外部无法通过new直接得到;
private static Singleton singleton=null; //在静态方法中使用,需要静态属性
public static Singleton getInstance(){ //声明为static静态,这样就给外部提供了一种调用方式,即Singleton.getInstance()得到实例
if(singleton == null){ //如果实例不存在就创建一个,如果存在直接返回。
synchronized (Singleton.class) { //这里考虑了线程安全问题
if(singleton == null){//这里需要再次验证是否存在,因为如果是两个线程在同时调用的话,第一个线程发现没有实例,然后创建一个,就在此时第二个线程也读到了Singleton==null并且正在等待线程1,那么线程1创建实例,放开锁后,线程2记录的是Singleton==null,所以他也要创建,这样冲突。
singleton = new Singleton();
}
}
}
return singleton;
}
}
优点:假如没用到的话,就不用创建,节省资源
缺点:用的比较多的话,耗时间,因为要判断
饿汉式:初始化的时候就创建了实例,用的时候直接拿出来方便,因为他很饿
//饿汉模式
class Singleton2{
private Singleton2(){};
private static Singleton2 singleton2 = new Singleton2();
private static Singleton2 getInstance(){
return singleton2;
}
}
优点:1.不用考虑线程安全问题
2.节约时间,不用每次判断
缺点:不管用不用,初始化就要创建,可能用不到而浪费资源
单例模式之个人笔记(一)