请为什么这个双检测单例对象不行
在<<Java 与设计模式>>一书中说双检测单例对象在java中是不行的,原码如下
public MySingleton
{
finl static private MySingleton instance_ = null;
private MySingleton()
{
}
public MySingleton instance()
{
if( instance_ != null )
return instance_;
// 进入同步( 刚学同步关键词忘了 )
synchronized(this)
{
if( instance_ != null )
return instance_;
instance_ = new MySingleton();
return instance_;
}
}
}
书中的解释是在instance_ = new MySingleton();一句的执行顺序不一致,我对这一句话的解理是在这一句中会做下面几件事情
1 先在堆上new一块内存
2 调用MySingleton的构造函数
3 将生成的对象引用赋给instance_
双检测单例对象在java中是不行是因为2,3的执行顺序不能确定。
如果我的理解没错的话,那么人为的介入它的执行顺序,保证的它的执行顺序的话,就没有问题了。
将 instance_ = new MySingleton();
一句改为
MySingleton Tmp_instance = new MySingleton();
instance_ = Tmp_instance;
不就行了吗?
本人一直用c++,刚学java不久,有什么不对的地方请指出来。