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的引用不是吗?

解决方案 »

  1.   

    你好,在你发的文章里的程序清单4下面说到,单例对象在构造函数完成之前,此时已经不是null对象,这个时候线程1被线程2预占,但我的问题是,在构造函数未完成之前,线程A会跳出同步块吗?不会的话怎么会被线程2抢占?
      

  2.   

    你好,在你发的文章里的程序清单4下面说到,单例对象在构造函数完成之前,此时已经不是null对象,这个时候线程1被线程2预占,但我的问题是,在构造函数未完成之前,线程A会跳出同步块吗?不会的话怎么会被线程2抢占?