我有两个线程:
线程数:1
a = 1;
x = b;
线程数:2
b = 1
y = a
在这里,a和b被声明为volatile。我不了解如何在a = 1之间创建“先发生”边;y = a; 在x = b之间; 并且b = 1;
我知道通过使用volatile变量可以防止从线程缓存中读取过时的值。但是,可变变量如何才能确保在订购前发生。
具体来说,我不明白这一点:
后续每次读取同一字段之前,都会对易失字段进行写操作。
e头有效吗?
后续每次读取同一字段之前,都会对易失字段进行写操作。
这里的重要词是“后续”。
这是Java语言规范17.4.4同步顺序的相关部分:
每个执行都有一个同步顺序。同步顺序是执行中所有同步动作的总顺序。对于每个线程t,t中的同步动作(第17.4.2节)的同步顺序与t的程序顺序(第17.4.3节)一致。同步动作在动作上引发了同步关系,定义如下:
- […]
- 对volatile变量(第8.3.1.4节)的写操作将与任何线程对v的所有后续读取进行同步(其中,后续操作是根据同步顺序定义的)。
注意最后一部分。因此,这就是说,如果您考虑程序动作的任何总排序,那么对volatile变量的任何读取(在该总排序中都比写入晚)将无法“忽略”该写入。
我最近与一家软件公司进行了一次面试,他问了我以下问题: 你能给我描述一下在变量前面添加volatile有什么作用吗?你能给我解释一下为什么这很重要吗? 我的大部分编程知识都来自C语言,但我的工作岗位是C#(我想如果需要的话,我可以特别为这个问题添加一些信息)
问题内容: 我想说明 先发生的 关系如何与 volatile 变量一起使用。让我们有以下变量: 和线程A: 和线程B: 根据Java内存模型(JMM),以下语句正确吗? 如果没有,正确的解释是什么? 总是在 发生之前 __仅在JMM中实际发生时才 发生- 在JMM中 __ 如果实际上发生在时间之前,则发生在JMM中-before -before (并且将可预测地分配) 否则,和之间的顺序不确定,并
以下是经典的实践中的一致性: 当线程A写入一个易失性变量,随后线程B读取相同的变量时,A在写入易失性变量之前可见的所有变量的值在读取易失性变量后变得对B可见。 我不确定我真的能理解这句话。例如,在这种情况下,所有变量的含义是什么?这是否意味着使用对使用非volatile变量也有副作用<在我看来,这句话有一些我无法理解的微妙含义<有什么帮助吗?
问题内容: 因此,我正在阅读《 实践 中的 Java并发性》 这本书,而我只能停留在这一解释上,没有一个例子,我似乎无法理解。这是报价: 当线程将数据写入易失性变量,然后线程 读取同一变量时,在写入易失性变量之前可见的所有变量的值 将在读取易失性变量后变为可见。 有人可以给我一个反例的原因,为什么“在写入易失性变量之前可见的所有变量的值在读取易失性变量之后就变得可见”? 我很困惑,为什么在读取易失
我想澄清发生前关系是如何与不稳定变量一起工作的。让我们有以下变量: 和线程A: 和线程B: 根据Java内存模型(JMM),以下语句是否正确?如果不是,正确的解释是什么? 总是发生-之前 在JMM中发生在之前,只有当它实际发生在时间之前 在JMM中发生在之前(并且将被可预测地分配)如果实际发生在
教程http://tutorials.jenkov.com/java-concurrency/volatile.html说 如果读取/写入最初发生在对易失性变量的写入之前,则不能将从其他变量的读取和写入重新排序为在对易失性变量的写入之后发生。写入挥发性变量之前的读取/写入保证在写入挥发性变量之前“发生”。 什么是“写入挥发性变量之前”?这是否意味着以前的读/写在相同的方法中,我们正在写入易失性变量