the double-check locking broken  主要解释下内存模型相关的这篇文章

http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

// Broken multithreaded version
// "Double-Checked Locking" idiom
class
private Helper helper = null;  
public
if (helper == null)   
synchronized(this) {  
if (helper == null)   
new
      }      
return
    }  
// other functions and members...
  }


 

双检查锁,应用范围很广,很多开源项目,spring,tomcat都能找到。但以上算法是有问题。

出现问题的原因之一:暴露未构造完整的对象。由于编译器或者cpu指令优化,可能导致出现,将未构造完整的Helper对象

引用赋值给 helper字段。假设Helper有个int 属性id = 100。就是说客户端获取到的这个helper,id的值可能是0(没有被正确初始化,即未被构造完整)。解决方法是加volatile。volatile有效防止reorder,从而保证赋值前对象是完整构造过的。