并发编程陷阱系列(五)double check
程序员文章站
2022-03-02 08:49:17
...
public static Singleton getInstance() { if (instance == null) { synchronized(Singleton.class) { //1 if (instance == null) //2 instance = new Singleton(); //3 } } return instance; }
The theory behind double-checked locking is perfect. Unfortunately, reality is entirely different. The problem with double-checked locking is that there is no guarantee it will work on single or multi-processor machines.
推荐的做法:
public class Singleton { /** * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 * 没有绑定关系,而且只有被调用到时才会装载,从而实现了延迟加载 */ private static class SingletonHolder{ /** * 静态初始化器,由JVM来保证线程安全 */ private static Singleton instance = new Singleton(); } /** * 私有化构造方法 */ private Singleton(){ } public static Singleton getInstance(){ return SingletonHolder.instance; } }
参考:http://www.ibm.com/developerworks/java/library/j-dcl/index.html
推荐阅读
-
Python: 进阶系列之五:并发编程:异步IO(asyncio) 协程(coroutine)与任务(task)的使用
-
并发编程陷阱系列(五)double check
-
并发编程陷阱系列(八)不要吞食CountDownLatch的线程异常
-
并发编程陷阱系列(六)高并发环境下使用性能较低的Map
-
并发编程陷阱系列(四)volatile与变量脏读
-
并发编程陷阱系列(三)使用Thread.interrupt()中断线程
-
并发编程陷阱系列 (二)InterruptException无处不在
-
并发编程陷阱系列(七)读多写少使用synchronized导致性能下降
-
并发编程陷阱系列 (一)同步不完全
-
并发编程陷阱系列(七)读多写少使用synchronized导致性能下降