首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有同步块的Java内存模型中Singleton的弱点

具有同步块的Java内存模型中Singleton的弱点
EN

Stack Overflow用户
提问于 2015-03-21 19:37:40
回答 1查看 251关注 0票数 0

我正在读Nir的“多处理器计算的艺术”。它解释了Java内存模型,并在第62页给出了一个示例:

代码语言:javascript
复制
public static Singleton getInstance() {
  if (instance == null) {
    synchronized(Singleton.class) {
      if (instance == null)
      instance = new Singleton();
    }
  }
  return instance;
}

并说:

这种模式曾经很常见,但却是不正确的。在第5行,构造函数调用似乎是在分配实例字段之前进行的,但是Java内存模型允许这些步骤无序进行,从而有效地使其他程序可以看到部分初始化的Singleton对象。

那么,这是否意味着这种同步可能不能保证我们从Singleton那里得到什么呢?

EN

回答 1

Stack Overflow用户

发布于 2015-03-21 19:54:44

那么,这是否意味着这种同步可能不能保证我们从Singleton那里得到什么呢?

这取决于你想从独生子女那里得到什么。如果您只想要一个实例,那么代码片段中的解决方案将实现这一点。如果您只想要一个实例,并且希望在访问它的时完全初始化该实例(这要求太多了吗?),那么,不,您不会通过代码片段来实现这一点。

另一个线程调用getInstance并读取instance字段的值

代码语言:javascript
复制
if (instance == null) {

可能会看到指定的值引用尚未由控制器初始化的对象。由于该值不是null,所以该方法返回它,未初始化的对象泄漏。

这是通过将字段标记为volatile来修正的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29187165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档