当前位置: 首页 > 知识库问答 >
问题:

为什么SafePoint类从实践书中的并发标记为@ThreadSafe?

蒋斯伯
2023-03-14

在Java并发实践书中,您可以找到以下代码:

@ThreadSafe
public class SafePoint { 
    @GuardedBy("this") private int x, y;
    private SafePoint(int[] a) { this(a[0], a[1]); }
    public SafePoint(SafePoint p) { this(p.get()); }
    public SafePoint(int x, int y) { 
        this.x = x;
        this.y = y;
    }
    public synchronized int[] get() { return new int[] { x, y };
    }
    public synchronized void set(int x, int y) { this.x = x;
        this.y = y;
    }
}

我很确定这个类不是线程安全的(如果我正确理解这个术语的话)。

示例:

 SafePoint racePublishedSafePoint; // field

 // thread 1:
 racePublishedSafePoint = new SafePoint(1,1);

 // thread 2:
 SafePoint sp;
 while(true){
   SafePoint sp = racePublishedSafePoint;
   if(sp != null) break;
 }
 System.out.println(sp.get()[0]);
 System.out.println(sp.get()[1]);

我认为有几种可能的结果:

    null

如果为真,为什么作者将类标记为线程安全?我认为线程安全类-类可以在并发应用程序中使用,而不需要复杂的分析。

作者想说什么?

我已经阅读了私有构造函数以避免竞争条件

...我的题目不重复。

共有1个答案

苗阳文
2023-03-14

我同意OP的观点,即该示例似乎违反了对@threadsafe保证的通常理解。不安全的发布竞赛是非常真实的,当然,在通过竞赛发布safepoint时,您可以看到令人费解的行为。一些现实生活中的线程安全类能够在racy publication中存活下来(string就是一个臭名昭著的例子),增加了混乱。

至于JCIP的叙述,我手边没有纸质或电子副本,所以联系了Doug Lea(主要作者之一),他说:

我认为混乱的部分是在JCIP文本中。我不认为@threadsafe涵盖了发布竞赛,或者在构造过程中可能遇到的任何其他竞赛。出版物安全分开处理。

不过,我能看出人们怎么会有不同的想法。这是我们探索始终在构造函数中放置释放栅栏的原因之一。

Doug正在谈论的最后一部分在“所有领域都是最终的”中进行了简要描述,包括动机、实验补丁和性能估计。

 类似资料:
  • 问题内容: 在《 Java并发实践》一书中,您可以找到以下代码: 此标记为 。 我很确定此类不是线程安全的(如果我正确理解了这个术语的话)。 例: 我相信有几种可能的结果: 应用程序没有完成 其他 如果应用程序完成,我们可以看到 a)0 0 b)0 1 c)1 0 d)1 1 我对吗? 如果为true,那么为什么作者将类标记为线程安全?我认为线程安全类-无需复杂的分析就可以在并发应用程序中使用的类

  • 问题内容: 当我打开JMeter仪表板时,我可以在列中看到成功,而在列中看到失败。根据城市词典 KO等于OK “ KO”等价于表示“ OK”的字母的含义和缩写 还是法国的非正式缩写? 我注意到,法语和意大利语非正式交流中的首字母缩写词KO意味着“不好” 我看到了有关将KO标签更改为失败的不同问题。 为什么JMeter将错误称为,在性能测试中还有其他含义吗?还是在积极思考失败也可以的地方? 问题答案

  • 我有一些Java类在项目视图中用红色标记,但IntelliJ IDEA没有显示错误,可以正常运行。有什么问题吗?

  • 问题内容: 出于好奇,为什么< img >标签没有在 HTML中 关闭? 我还注意到,< img >标记在 XHTML中 已显式关闭。 问题答案: 从历史上看,HTML一直基于SGML,它允许在某些情况下省略标签。 由于元素不能有任何子节点,因此将其定义为EMPTY,并且禁止使用end标签(因为它将毫无用处)。 XHTML是用XML表示的HTML,并且XML不支持可选或禁止的标签(尽管它允许使用自

  • 主要原因有两个:关注点分离(SOC)和性能。事实上,它们应该是使用并发的唯一原因;如果你观察得足够仔细,所有因素都可以归结到其中的一个原因(或者可能是两个都有。当然,除了像“就因为我愿意”这样的原因之外)。 1.2.1 为了分离关注点 编写软件时,分离关注点是个好主意;通过将相关的代码与无关的代码分离,可以使程序更容易理解和测试,从而减少出错的可能性。即使一些功能区域中的操作需要在同一时刻发生的情

  • 问题内容: 我正在构建一个基于expressjs的应用程序,我想在其中记录所有事件。我可以找到温斯顿,这似乎很酷。无论如何,我正在寻找一种方法将其连接到我的expressjs应用程序。 我还想要在应用程序内部登录。我的要求不是那么简单,所以我想将所有内容记录在我的应用程序中(不仅是请求)。 我目前的情况: server.js (我想在此级别记录http请求) 路线/something.js con