26得票1回答
Java中的内存栅是用来做什么的?

在尝试理解Java SE 9中新增的SubmissionPublisher(OpenJDK 10源代码, Javadoc)类的实现时,我发现了一些之前不知道的VarHandle API调用: fullFence、acquireFence、releaseFence、loadLoadFence和...

24得票5回答
volatile关键字在可见性时间性方面的详细语义

考虑一个volatile int sharedVar。我们知道JLS(Java语言规范)给出了以下保证: 在程序顺序中,写入线程的每个值为i的写入sharedVar操作之前的所有操作happens-before此次写入操作; 写入线程w的值为i的写操作happens-before读取线程r...

23得票2回答
Java:volatile隐含的顺序保证

我的问题是对这个问题的延伸:Volatile guarantees and out-of-order execution 为了更具体,假设我们有一个简单的类,在初始化后可以处于两种状态:class A { private /*volatile?*/ boolean state; ...

21得票2回答
请解释Java内存模型中所述的初始化安全性。

有人能解释一下Java内存模型所要求的初始化安全性是什么吗? final字段如何帮助实现初始化安全性? 构造函数在确保初始化安全性方面扮演了什么角色?

20得票9回答
Java并发:在构造函数中初始化的final字段是否线程安全?

有人能告诉我这个类是否线程安全吗?class Foo { private final Map<String,String> aMap; public Foo() { aMap = new HashMap<String, String>...

19得票2回答
Java重排序对System.currentTimeMillis()有影响吗?

根据Java内存模型,只要执行是良好形式的,指令可以被重新排序。 因此我想知道,以下代码是否可能产生以下输出结果? [在同一线程中的代码]long a = System.currentTimeMillis(); long b = System.currentTimeMillis(); lo...

19得票4回答
对象构造后读取字段陈旧值

我正在阅读Brian Goetz所著的《Java并发编程实践》一书。第3.5节和3.5.1小节中的一些语句我无法理解。请考虑以下代码:public class Holder { private int value; public Holder(int value) { thi...

17得票3回答
Java:带有getter和setter的`volatile`私有字段

如果实例在多个线程中使用,我们应该将私有字段声明为volatile吗? 在Effective Java中,有一个例子,在没有volatile的情况下代码无法正常工作: import java.util.concurrent.TimeUnit; // Broken! - How long ...

16得票3回答
为什么Java内存模型允许这种行为?

JMM中的因果关系似乎是其中最令人困惑的部分。我有几个关于JMM因果关系和并发程序中允许的行为的问题。 据我所知,当前的JMM总是禁止因果循环。(我是对的吗?) 现在,根据JSR-133文档第24页的第16图,我们有一个例子: 最初,x = y = 0 线程1:r3 = x; if (...

16得票3回答
举升和重排序是相同的吗?

我从《Effective Java》中读到,在缺乏同步的情况下,虚拟机可以将序列A转换为序列B,并称之为hoisting。我还在某处读到,如果变量没有声明为volatile,则涉及变量的指令可以被重新排序。那么hoisting和重新排序是一样的吗? while (!done) sequ...