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,从而保证赋值前对象是完整构造过的。