假设此类:
public class AmIThreadSafe {
private int a;
private int b;
AmIThreadSafe(int a, int b) {
this.a = a;
this.b = b;
}
}
假设(引用)转义后volatile
,某些线程(导致竞争状态)可以访问实例对此类的引用(声明为)this
:
volatile AmIThreadSafe instance = new AmIThreadSafe(1,2);
在这里,我确定分配instance
引用的事实是 在 线程读取 之前发生的 。
但是AmIThreadSafe's
领域呢?
外部volatile
关键字是否还暗示happens- before
与a
和b
字段的关系?还是由于构造函数期间潜在的语句重新排序而导致任何线程看到过时的值(0
在这种情况下,因为是默认值int
)而导致结束?
换句话说,我是否应该声明a
和(b
final
或)volatile
防止JMM出现任何意外,还是仅volatile
在实例的引用上表明足够?
---------------- 更新后的帖子-好的答案: --------------------------- –
下一篇文章通过其示例确认了我的情况,a
并且b
免受JMM优化的影响,以防止永久性 事前发生的 关系。
http://jeremymanson.blogspot.fr/2008/11/what-volatile-means-in-
java.html
声明instance
为as volatile
不会使其成为字段volatile
,但是,如果我正确理解了您的问题,那么-
是的,就您的情况而言就足够了。
根据规范的第17.4.5节:
volatile
将在一个线程中进行写入。 __volatile
因此,如果一个线程认为instance
已初始化,则在该instance
事件之前 对其进行初始化,而在
之前进行instance
字段的初始化,因此该线程将 在 此 之前 将其instance
字段视为已初始化。
我仍然被那些为了支持移动和转发而发明的规则弄糊涂了。有一件事我还不太确定: 转发引用是否只是rvalue引用(应用了引用折叠规则)? 如果它是一个rvalue引用,那么为什么函数: 不仅接受rvalues,还接受lvalues?
问题内容: 我有一个与数据库无关的Java程序,在插入时,我需要知道是否由于重复的键而引发了SQLException。 如果我使用的是单个数据库驱动程序,那么我将只使用ErrorCode,但是由于可以使用非常不同的引擎,因此ErrorCode是不同的。 有人做过吗?有任何想法吗? 许多TIA! 编辑: 我有一个配置文件,其中存储了驱动程序类(即:org.apache.derby.jdbc.Clie
问题内容: PHP中是否有一种方法可以确定给定变量是否是对另一个变量的引用和/或被另一个变量引用?考虑到php.net上的注释,设置可能意味着“ $ a和$ b在这里完全相等。 我可能会无法分开检测“对……的引用”和“对……的引用” 。$ a并不指向$ b或反之亦然。$ a和$ b指向同一位置。 ” 如果无法确定给定变量是否是引用/引用,是否存在一种通用方法来确定两个变量是否是彼此引用?再次,对p
问题内容: C#区分了这两个。java会做相同还是不同? 问题答案: 在Java中,所有对象和枚举都是引用类型,所有原语都是值类型。就复制语义而言,两者之间的区别与C#中的区别相同,但是您不能在Java中定义新的值类型。
问题内容: 建议在HTML页面中使用表格(现在已经有了CSS)? 表格有什么用途?表具有哪些CSS所没有的功能? 问题答案: 一点都不。但是将表格用于表格数据。只是不要将它们用于一般布局。 但是,如果您显示表格数据(例如结果或什至是表格),请继续使用表格!
我正在重写一个Spring MVC系统。 该系统简单地说是这样的:[Gateway<->Backend Services<->Databases],其中Gateway是一个控制器,只用于身份验证和将请求转发到后端服务。 后端服务将重构为微服务。我将使用尤里卡服务为他们每个人做登记。因此,最终的体系结构将是:[网关<->Eureka<->后端微服务<->数据库]。网关将从Eureka服务器查找注册表