此代码用于演示双重检查锁定反模式:
@NotThreadSafe
public class DoubleCheckedLocking {
private static Resource resource;
public static Resource getInstance() {
if (resource == null) {
synchronized (DoubleCheckedLocking.class) {
if (resource == null)
resource = new Resource();
}
}
return resource;
}
}
我可以通过修改它来避免这个问题吗:
@NotThreadSafe
public class DoubleCheckedLocking {
private static Resource resource;
public static Resource getInstance() {
if (resource == null) {
synchronized (DoubleCheckedLocking.class) {
if (resource == null){
Resource r=new Resource();
resource = r;
}
}
}
return resource;
}
}
据我所知,
Resource r=new Resource();
resource = r;
该编译器应该为此提供先发生关系。
最佳答案
据我所知,唯一已知的双重检查锁定模式(对于 JDK5 及更高版本)有效的实现使用了“volatile”关键字。 See Fixing Double-Checked Locking using Volatile
关于java 并发实践 16.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12438687/