我已经读过单例的双重检查机制是失败的,因为 JVM 后面的一些内存模型使得即使构造函数没有完全执行,引用读取也不为空。
我尝试通过在下面的代码中的构造函数中进行操作来测试相同的内容,但即便如此它似乎工作正常。
public class Singleton {
private static Singleton singleton;
private Integer i = 0;
private Singleton() {
for(long j = 0; j<99999999; j++){
double k = Math.random();
k= k+1;
}
i = 10;
}
private static Singleton getSinglton() {
if(singleton == null){
synchronized (Singleton.class) {
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
public static void main(String[] args) {
Runnable runnable1 = new Runnable() {
@Override
public void run() {
Singleton singleton = Singleton.getSinglton();
System.out.println(singleton.getI());
}
};
Thread t1 = new Thread(runnable1);
Thread t2 = new Thread(runnable1);
Thread t3 = new Thread(runnable1);
Thread t4 = new Thread(runnable1);
Thread t5 = new Thread(runnable1);
Thread t6 = new Thread(runnable1);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
}
public void setI(Integer i) {
this.i = i;
}
public Integer getI() {
return i;
}
}
我得到的结果是 10 10 10 10 10 10
我期望很少有线程读取值 0 而不是 10,但每次该值被正确读取为 10 ,所以它在 Java SE-1.6 中解决了问题,因为我使用的是相同的?