设计模式

单例模式:

/**
* 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,判断不为空,直接返回相应的实例引用,此时该实例还未初始化,可能导致程序出错。

  

 

posted @ 2021-03-04 19:24  南极星辰  阅读(55)  评论(0)    收藏  举报