可变变量和其他变量

可变变量和其他变量

本文介绍了可变变量和其他变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下来自经典的Concurency in Practice:

当线程 A 写入 volatile 变量并随后写入线程 B 时读取相同的变量,所有 变量的值在写入 volatile 变量之前对 A 可见,变为可见读取 volatile 变量后到 B.

我不确定我是否真的能理解这句话.例如,在这种情况下所有变量是什么意思?这是否意味着使用 volatile 也会对非 volatile 变量的使用产生副作用?
在我看来,这句话有一些我无法理解的微妙含义.
有什么帮助吗?

I am not sure I can really understand this statement. For example, what is the meaning of all variables in this context? Does this mean that using volatile also has side-effects to the usage of non-volatile variables?
It seems to me that this statement has some subtle meaning that I can not grasp.
Any help?

推荐答案

您的问题的答案在 JLS #17.4.5:

写入易失性字段(第 8.3.1.4 节)发生在该字段的每次后续读取之前.

所以如果在一个线程中你有

So if in one thread you have

aNonVolatileVariable = 2 //w1
aVolatileVariable = 5 //w2

随后在另一个线程中:

someVariable = aVolatileVariable //r1
anotherOne = aNonVolatileVariable //r2

您可以保证 anotherOne 将等于 2,即使该变量不是 volatile.所以是的,使用 volatile 也会对非 volatile 变量的使用产生副作用.

You have the guarantee that anotherOne will be equal to 2, even if that variable is not volatile. So yes, using volatile also has side-effects to the usage of non-volatile variables.

更详细地说,这是由于 Java 内存模型 (JMM) 在同一部分提供了另外 2 个保证:线程内顺序和传递性(hb(x,y) 表示 x 发生在 y 之前):

In more details, this is due to 2 other guarantees provided by the Java Memory Model (JMM) in that same section: intra thread order and transitivity (hb(x,y) means x happens before y):

如果 x 和 y 是同一个线程的动作,并且 x 在程序顺序中排在 y 之前,则 hb(x, y).
[...]
如果 hb(x, y)hb(y, z),则 hb(x, z).

在我的例子中:

  • hb(w1, w2)hb(r1, r2)(线程内语义)
  • hb(w2, r1) 因为 volatile 保证
  • hb(w1, w2) and hb(r1, r2) (intra thread semantics)
  • hb(w2, r1) because of the volatile guarantee

所以你可以通过传递性得出 hb(w1, r2) 的结论.

so you can conclude that hb(w1, r2) by transitivity.

如果程序与发生之前的关系正确同步,则 JMM 保证程序的所有执行将顺序一致(即看起来没有重新排序).所以在这种特定情况下,非易失性读取保证看到非易失性写入的效果.

And the JMM guarantees that all executions of a program will be sequentially consistent (i.e. will look like nothing has been reordered) if it is correctly synchronized with happens-before relationships. So in this specific case, the non-volatile read is guaranteed to see the effect of the non-volatile write.

这篇关于可变变量和其他变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-24 09:50