设计模式学习笔记——单例模式
public class Singleton {private static Singleton singleton;//创建一个静态变量来保存类的实例private Singleton(){}//将构造函数声明为私有,以防止外类访问,导致多次实例化public static Singleton getInstance(){//提供一个全局访问点,返回该类的唯一实例if(singleton==null){//检查实例是否已经存在,保证唯一性singleton=new Singleton();}return singleton;}}?
public synchronized static Singleton getInstance(){……}
public class Singleton {private static Singleton singleton=new Singleton();//提前实例化private Singleton(){}public static Singleton getInstance(){return singleton;}}
public class Singleton{ private volatile static Singleton singleton; //注意volatile private Singleton(){} public static Singleton getInstance(){ if(singleton==null){ synchronized(Singleton.class){//双重锁 if(singleton==null){ singleton=new Singleton(); } } } return singleton; } }
从网上看到的情况是,在不同的classloader或者虚拟机JVM下,可能会造成结果的不可预知,所以加了2重锁
然后查了一下volatile关键字,也是为了这个目的,声明为volatile的变量就是可能产生不可预知结果的,volatile保证变量总是从内存中拿去(好像是这样,谁能再补充下,也可能我理解不对)
?
最后是单例注册表
单例注册表就是将创建的实例放入到一个注册表中(HashMap),然后每次去注册表中查找实例是否被创建,同样是为了保证唯一性,而这样一个机制,个人理解类似于一个打印机请求的情况,多个打印请求1台打印机,每次只能打印(实例化)一个
?
另外看到还有用反射机制的,没有研究。。
?
这些基本就是我对单例模式的了解,有错误的地方,希望指出