public MyObject{
private static MyObect obj;
public static getInstance(){
if(obj == null){
synchronized(MyObj.class){
if(obj == null)
obj = new MyObject();
}
}
return obj;
}
}
这是一个双重检查锁的例子,大家一致认为这个方法之所以有问题是因为obj会由于指令重排而没有被完整初始化就被其他线程引用了,都是整个new的过程不是都在锁里面吗?就算指令重排,也应该是完成初始化操作才释放锁,其他线程才有机会拿到obj的引用不是吗?
private static MyObect obj;
public static getInstance(){
if(obj == null){
synchronized(MyObj.class){
if(obj == null)
obj = new MyObject();
}
}
return obj;
}
}
这是一个双重检查锁的例子,大家一致认为这个方法之所以有问题是因为obj会由于指令重排而没有被完整初始化就被其他线程引用了,都是整个new的过程不是都在锁里面吗?就算指令重排,也应该是完成初始化操作才释放锁,其他线程才有机会拿到obj的引用不是吗?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货