我希望确保我正确理解Java内存模型中“有效不可变对象”的行为。假设我们有一个可变类,我们想将其发布为有效不可变对象: class Outworld { // This MAY be accessed by multiple threads public static volatil...
Java内存模型(自1.5版本起)对待final字段与非final字段的方式有所不同。特别是,在构造函数中,只要this引用在构造过程中未逸出,即使通过数据竞争将对象提供给其他线程,对final字段的写入也保证在其他线程中可见。 (对非final字段的写入不保证可见性,因此如果您错误地发布它们...
我目前正在阅读JSR-133(Java内存模型),但我不明白为什么f.y可能没有被初始化(可能看到0)。有人能解释一下吗?class FinalFieldExample { final int x; int y; static FinalFieldExample f; ...
有没有比我更了解Java内存模型的人能够确认一下,以下代码已经正确同步?class Foo { private final Bar bar; Foo() { this.bar = new Bar(this); } } class Bar { ...
我知道JVM内存模型是为最简单的CPU设计的,因此必须假定JVM可以运行在最弱的CPU上(例如ARM)。 现在,考虑到x64有一个相当强大的内存模型,如果我知道我的程序只会在64位x86 CPU上运行,那么我可以忽略哪些同步操作呢?并且当我的程序通过虚拟化运行时是否也适用? 示例: 已知J...
这个问题只涉及内存可见性,而不是happens-before和happens-after。在Java中有四种方法可以保证一个线程对内存所做的更改对另一个线程可见。(参考http://gee.cs.oswego.edu/dl/cpj/jmm.html) 一个写线程释放同步锁,随后一个读线程获...
关于程序顺序以及它如何影响JMM中的重排序,我有一些问题。 在Java内存模型中,程序顺序(po)被定义为程序中每个线程中动作的总顺序。根据JLS,这会引发happens-before(hb)边缘: 如果x和y是同一线程的操作,并且x在程序顺序中出现在y之前,则hb(x,y)(即x happ...
我正在尝试解决一个简单的问题,但却陷入了Java内存模型的兔子洞。 编写一个包含非final引用字段的Java类,该字段在构造函数中被初始化为非空值,随后永远不会更改,并且没有任何其他线程可以通过任何后续访问看到非空值,最简单和/或最有效(根据判断),但是无竞争(根据JMM的准确定义)的方法...
假设有这样一个类:public void MyClass { private boolean someoneTouchedMeWhenIWasWorking; public void process() { someoneTouchedMeWhenIWasWo...
Java内存模型是否为线程池交互提供happens-before保证?具体而言,线程池工作线程在运行完工作队列中的项目之前所做的写入是否对运行该队列下一个项目的工作线程可见? 规范(我个人认为这个FAQ很有用:http://www.cs.umd.edu/~pugh/java/memoryMo...