在《 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]);
我相信有几种可能的结果:
应用程序没有完成
其他
如果应用程序完成,我们可以看到
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 代码: 我认为输入将是: 但不是,而是: 原因可能是什么?