当前位置: 首页 > 面试题库 >

为什么在实践书中将并发的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;
    }
}

此标记为 @ThreadSafe

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

例:

 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]);

我相信有几种可能的结果:

  1. 应用程序没有完成
    其他

  2. 如果应用程序完成,我们可以看到
    a)0 0
    b)0 1
    c)1 0
    d)1 1

我对吗?

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

作者想说什么?

聚苯乙烯

我已阅读
Private构造函数以避免出现竞争情况

…而且我的话题不是重复的。


问题答案:

我同意操作规范,认为该示例似乎违反了对@ThreadSafe担保的通常理解。不安全的发布竞赛是非常真实的,当然,SafePoint通过竞赛发布时,您会看到令人费解的行为。一些现实生活中的线程安全类在恶意出版物中幸免(这String是一个臭名昭著的例子),加重了混乱。

就JCIP的叙述而言,我没有纸质或电子副本,因此请Doug Lea(主要作者之一)联系,他说:

我认为混淆的部分在JCIP文本中。我认为不会@ThreadSafe涉及出版物竞赛,也不会
涉及在构建过程中可能遇到的任何其他竞赛。出版安全性单独处理。

尽管如此,我仍然可以看到人们会怎么想。这是我们探索始终在构造函数中放置发布围栏的原因之一。

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



 类似资料:
  • 在Java并发实践书中,您可以找到以下代码: 我很确定这个类不是线程安全的(如果我正确理解这个术语的话)。 示例: 我认为有几种可能的结果: null 如果为真,为什么作者将类标记为线程安全?我认为线程安全类-类可以在并发应用程序中使用,而不需要复杂的分析。 作者想说什么? 我已经阅读了私有构造函数以避免竞争条件 ...我的题目不重复。

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

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

  • 问题内容: 我有一个问题,为什么将main方法标记为 public ? 根据关于stackoverflow的回答,它声明为 静态 “该方法是静态的,因为否则会产生歧义:应调用哪个构造函数?” 但是,任何人都可以解释为什么总是将其宣布为 公开 吗? 问题答案: 启动程序的初始化软件必须能够看到以便可以调用它。

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

  • 下面的代码拆分数据,应用正则表达式,然后再次连接字符串(有一部分删除了单词之间的新行,因为我希望在单个块/行中输出段落): 输入: Lorem ipsum dolor坐在一起 Ipsum dolor sit amet,consetetur eirmod tempor invidunt ut laboure 代码: 我认为输入将是: 但不是,而是: 原因可能是什么?