线程安全的单例模式

来源:互联网 发布:js创建二维数组 编辑:程序博客网 时间:2024/06/03 19:33

1.双重检查加锁

2.volatile

public class Singleton {private static volatile Singleton instance;private Singleton(){}public static Singleton getInstance(){if (instance == null) {synchronized(Singleton.class){if (instance == null) {instance = new Singleton();}}}return instance;}}

备注:1).未添加修饰符volatile时,在一个线程进入同步锁,创建对象时,可能会造成另外的线程拿到一个不为null但是未初始化的instance。这是因为创建一个对象可分为三步:

//1:分配对象的内存空间

//2:初始化对象

//3:设置instance指向刚分配的内存地址

JAVA允许单线程内不会改变单线程程序执行结果的重排序的发生。也就是说,在单线程内,只要保证访问instance时instance已经初始化,那么3是有可能先于2发生的。

   2).volatile具有内存可见性,也就是说一个线程可以读到任意其他线程对该属性的最后写入。


参考文献:http://ifeve.com/double-checked-locking-with-delay-initialization/      //双重检查锁定及延迟初始化

                    http://www.infoq.com/cn/articles/java-memory-model-4/                  //volatile

0 0
原创粉丝点击