为什么使用双重检查锁定

时间:2015-10-30 03:03:12

标签: java double-checked-locking

关于我提出的previous question

    public static Singleton getInstanceDC() {
    if (_instance == null) {                // Single Checked (1)
        synchronized (Singleton.class) {
            if (_instance == null) {        // Double checked (2)
                _instance = new Singleton();
            }
        }
    }
    return _instance;

}

为什么我应该使用第二个实例null检查条件。它可能产生什么影响?

1 个答案:

答案 0 :(得分:4)

让我们编号行,这样我们就可以看到线程如何交错操作。

if (_instance == null) {                // L1
    synchronized (Singleton.class) {    // L2
        if (_instance == null) {        // L3
            _instance = new Singleton();// L4
        }
    }
}

让我们考虑交错而不检查L3。

  1. 主题1到达L1,_instancenull
  2. 线程2到达L1,_instancenull
  3. 线程1获取L2
  4. 的互斥锁
  5. 线程2尝试在L2处获取互斥锁但阻止
  6. 线程1创建新实例并在L4分配
  7. 线程1从L2
  8. 释放互斥锁
  9. 线程2在L2
  10. 获得互斥
  11. 线程2创建新实例并在L4分配
  12. 线程2从L2发布互斥锁
  13. 创建了Singleton的两个实例。每个线程都返回自己的实例。

    在L3检查时,步骤8没有发生,因为在第7步,线程2的_instance视图与线程1同步,因此只创建了Singleton的一个实例。