关于singleton的双重检查问题,这样能不能解决?

jiangchun_xn 2004-11-23 05:35:07

换了工作,最近学习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一些底层的东西不熟,希望哪位高手能够帮我看看这样会不会导致其他的问题?
...全文
140 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dwei 2004-11-24
  • 打赏
  • 举报
回复
《msdn 开发精选》2004年第6期(总第2期)

探究Singleton设计模式
本文对于Singleton做了大胆深入的研究,并且探讨了C++、Java和C#中的Singleton实现。

可以看看,不错。

^_^
jiangchun_xn 2004-11-24
  • 打赏
  • 举报
回复

并不是说singleton的这种应用,因为其他情况也可能发生。

现在我已经明白为什么不行了。我还是得好好去看看JVM spec.谢谢大家。
fantasyCoder 2004-11-23
  • 打赏
  • 举报
回复
double checked 已经讨论很多了..
这钟线程模式JVM是不支持的...

最好的方式就是最简单的
private static Instance instance = new Instance();

private Instance(){}

public Instance newInstance(){
return this.instance();
}
jeffyan77 2004-11-23
  • 打赏
  • 举报
回复
建议你先学学javap然后再考虑这个问题。
yuyue28 2004-11-23
  • 打赏
  • 举报
回复
用另一种单件实现方式,就没有这个问题了。
class A{
private A(){}
private static A m_a = null;
static{
m_a = new A();
}
showerXP 2004-11-23
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=184427
onyxleo 2004-11-23
  • 打赏
  • 举报
回复
我赞同你的说法。
jiangchun_xn 2004-11-23
  • 打赏
  • 举报
回复

我并不是在使用singleton 遇到这个问题,在另外的地方涉及到这个问题,所以我自己只能想出这种方式来做,不知道是否正确。

50,535

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧