在尝试理解Java SE 9中新增的SubmissionPublisher(OpenJDK 10源代码, Javadoc)类的实现时,我发现了一些之前不知道的VarHandle API调用: fullFence、acquireFence、releaseFence、loadLoadFence和...
考虑一个volatile int sharedVar。我们知道JLS(Java语言规范)给出了以下保证: 在程序顺序中,写入线程的每个值为i的写入sharedVar操作之前的所有操作happens-before此次写入操作; 写入线程w的值为i的写操作happens-before读取线程r...
我的问题是对这个问题的延伸:Volatile guarantees and out-of-order execution 为了更具体,假设我们有一个简单的类,在初始化后可以处于两种状态:class A { private /*volatile?*/ boolean state; ...
有人能解释一下Java内存模型所要求的初始化安全性是什么吗? final字段如何帮助实现初始化安全性? 构造函数在确保初始化安全性方面扮演了什么角色?
有人能告诉我这个类是否线程安全吗?class Foo { private final Map<String,String> aMap; public Foo() { aMap = new HashMap<String, String>...
根据Java内存模型,只要执行是良好形式的,指令可以被重新排序。 因此我想知道,以下代码是否可能产生以下输出结果? [在同一线程中的代码]long a = System.currentTimeMillis(); long b = System.currentTimeMillis(); lo...
我正在阅读Brian Goetz所著的《Java并发编程实践》一书。第3.5节和3.5.1小节中的一些语句我无法理解。请考虑以下代码:public class Holder { private int value; public Holder(int value) { thi...
如果实例在多个线程中使用,我们应该将私有字段声明为volatile吗? 在Effective Java中,有一个例子,在没有volatile的情况下代码无法正常工作: import java.util.concurrent.TimeUnit; // Broken! - How long ...
JMM中的因果关系似乎是其中最令人困惑的部分。我有几个关于JMM因果关系和并发程序中允许的行为的问题。 据我所知,当前的JMM总是禁止因果循环。(我是对的吗?) 现在,根据JSR-133文档第24页的第16图,我们有一个例子: 最初,x = y = 0 线程1:r3 = x; if (...
我从《Effective Java》中读到,在缺乏同步的情况下,虚拟机可以将序列A转换为序列B,并称之为hoisting。我还在某处读到,如果变量没有声明为volatile,则涉及变量的指令可以被重新排序。那么hoisting和重新排序是一样的吗? while (!done) sequ...