关于singleton的双重检查问题,这样能不能解决?
换了工作,最近学习java,在java与模式的书中提到singleton模式的双重检查不成立,
class Singleton
{
private Singleton instance;
public static Singleton get_instance()
{ if( instance == null )
{ synchronized( Std.class )
{ if( instance == null )
instance = new Singleton();
}
}
return instance;
}
}
意思是当执行instance = new Singleton();的时候,可能会发生instance的值已经指向一个正确的句柄(地址?),但是构造函数还未执行。这是其他线程异步判断instance!=null就通过了,结果可能访问并没有初始化完全的对象。
书中提到的信息比较少,最后结论不使用这种方式来做(用饿汉式)。但是这个问题不仅仅在于singleton模式,另外一些可能涉及此的线程安全性问题也可能存在。但是我不知道我这样做是否能够解决这个问题:
public static Singleton get_instance()
{
if( instance == null )
{ synchronized( Std.class )
{
if( instance == null )
{
Singleton tmpInst = new Singleton();
instance = tmpInst;// 应该已经建立完全。
}
}
}
return instance;
}
我对java一些底层的东西不熟,希望哪位高手能够帮我看看这样会不会导致其他的问题?