设计模式
单例模式:
/**
* double check模式
*/
public class Singleton { private static volatile Singleton singleton; private Singleton() { } public static Singleton getInstance() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; }
为什么需要第二个if:
当a,b两个线程同时经过了第一个if,a线程进入第二个if后成功创建实例,b线程进入第二个线程后判断不为空直接返回。没有第二个if,b线程也会创建一个实例。
为什么需要volatile关键字:
singleton = new Singleton(); 不是一个原子操作,具体可划分为3部:
1. 分配内存空间
2. 调用构造方法进行实例初始化
3. 将引用指针指向该内存空间
其中2,3两步可能调换顺序,因此最终执行顺序可能为1,2,3或者1,3,2.
在1,3,2的情况下,a线程先执行1,3后,此时singleton已近不为空,此时若有线程c经过第一个if,判断不为空,直接返回相应的实例引用,此时该实例还未初始化,可能导致程序出错。

浙公网安备 33010602011771号