我想说明 先发生的 关系如何与 volatile 变量一起使用。让我们有以下变量:
public static int i, iDst, vDst;
public static volatile int v;
和线程A:
i = 1;
v = 2;
和线程B:
vDst = v;
iDst = i;
根据Java内存模型(JMM),以下语句正确吗? 如果没有,正确的解释是什么?
i = 1
总是在 发生之前 v = 2
v = 2
__vDst = v
仅在JMM中实际发生时才 发生- 在JMM中i = 1
__ 如果实际上发生在时间之前,则发生iDst = i
在JMM中-before -before (并且iDst
将可预测地分配1
)v = 2``vDst = v
i = 1
和之间的顺序iDst = i
不确定,并且的结果值iDst
也不确定逻辑错误:
有一个在JMM没有“挂钟时间”的概念,我们应该依靠 同步顺序 作为排序指南v = 2
和vDst = v
。有关更多详细信息,请参见所选答案。
i = 1
总是在 发生之前 v = 2
真正。根据JLS第17.4.5条,
如果 x 和 y 是同一线程的动作,并且 x 按程序顺序位于 y 之前,则 hb(x,y) 。
v = 2
__vDst = v
仅在JMM中实际发生时才 发生- 在JMM中i = 1
__ 如果实际上发生在时间之前,则发生iDst = i
在JMM中-before -before (并且iDst
将可预测地分配1
)v = 2``vDst = v
假。先发生先后顺序不能保证事物在物理时间内先发生。在JLS的同一部分,
应该注意的是,两个动作之间存在先发生关系并不一定意味着在实现中它们必须按照该顺序进行。如果重新排序产生的结果与合法执行相符,则不合法。
它,然而,保证v = 2
之前发生 vDst = v
和i = 1
之前发生 iDst = i
,如果v = 2
之前谈到vDst = v
的同步顺序,在执行,往往是误认为是实时订单的同步动作的总订单。
i = 1
和之间的顺序iDst = i
不确定,并且的结果值iDst
也不确定这是,如果情况vDst = v
到来之前v = 2
在同步顺序,但实际时间不来了进去。
我想澄清发生前关系是如何与不稳定变量一起工作的。让我们有以下变量: 和线程A: 和线程B: 根据Java内存模型(JMM),以下语句是否正确?如果不是,正确的解释是什么? 总是发生-之前 在JMM中发生在之前,只有当它实际发生在时间之前 在JMM中发生在之前(并且将被可预测地分配)如果实际发生在
问题内容: 我有两个线程: 线程数:1 线程数:2 在这里,a和b被声明为volatile。我不了解如何在a = 1之间创建“先发生”边;y = a; 在x = b之间; 并且b = 1; 我知道通过使用volatile变量可以防止从线程缓存中读取过时的值。但是,可变变量如何才能确保在订购前发生。 具体来说,我不明白这一点: 后续每次读取同一字段之前,都会对易失字段进行写操作。 e头有效吗? 问题
以下是经典的实践中的一致性: 当线程A写入一个易失性变量,随后线程B读取相同的变量时,A在写入易失性变量之前可见的所有变量的值在读取易失性变量后变得对B可见。 我不确定我真的能理解这句话。例如,在这种情况下,所有变量的含义是什么?这是否意味着使用对使用非volatile变量也有副作用<在我看来,这句话有一些我无法理解的微妙含义<有什么帮助吗?
问题内容: 因此,我正在阅读《 实践 中的 Java并发性》 这本书,而我只能停留在这一解释上,没有一个例子,我似乎无法理解。这是报价: 当线程将数据写入易失性变量,然后线程 读取同一变量时,在写入易失性变量之前可见的所有变量的值 将在读取易失性变量后变为可见。 有人可以给我一个反例的原因,为什么“在写入易失性变量之前可见的所有变量的值在读取易失性变量之后就变得可见”? 我很困惑,为什么在读取易失
我最近与一家软件公司进行了一次面试,他问了我以下问题: 你能给我描述一下在变量前面添加volatile有什么作用吗?你能给我解释一下为什么这很重要吗? 我的大部分编程知识都来自C语言,但我的工作岗位是C#(我想如果需要的话,我可以特别为这个问题添加一些信息)
教程http://tutorials.jenkov.com/java-concurrency/volatile.html说 如果读取/写入最初发生在对易失性变量的写入之前,则不能将从其他变量的读取和写入重新排序为在对易失性变量的写入之后发生。写入挥发性变量之前的读取/写入保证在写入挥发性变量之前“发生”。 什么是“写入挥发性变量之前”?这是否意味着以前的读/写在相同的方法中,我们正在写入易失性变量