在阅读了关于这个主题的一系列问题/文章之后,还有一件事我不清楚。
根据我的理解(如果我错了请纠正我)是变量的值可以在本地缓存到一个线程,所以如果一个线程更新了该变量的值,这个变量可能对另一个变量不可见线。然后使用volatile
实际上是强制所有线程从同一位置读取变量的值。此外,关于该主题的所有文献都指出,同步该变量将具有相同的效果。
我的问题是,我读过的任何内容都没有明确指出同步不同的变量会导致同样的行为,但经常会提供一个代码示例,说明在以下两种情况下的值是从变量读取将是最新的:
volatile int x;
...
int y = x;
和
final Object lock = new Object();
int x;
...
synchronized(lock) {
int y = x;
}
问题是:是否会同步任意变量会强制同步块中的每个变量访问权限来访问该变量的最新值?
答案 0 :(得分:5)
是否同步任何一个 任意变量将强制每个变量访问 synchronized块来访问最新的值 变量?
只要在同一变量的同步下写入该变量,就可以同步任何变量进行读取。
在您的示例中,只要发生类似以下内容的事件,那么在写入x
之前发生的所有写操作将在后续读取后显示:
synchronized(lock){
x = 10;
}
所以到了你之前的观点:
...我读过的任何内容都没有明确说明同步不同 变量会导致同样的行为......
这是因为它不提供相同的行为。发生在以前的关系有几次发生,在你的情况下有两个重要的关系是
答案 1 :(得分:2)
有一篇具有启发性的文章here,其中提到:
在Java内存模型中,易失性字段在写入之后插入存储障碍 加载障碍< / strong>在阅读之前插入 。 ...
请注意,没有特定于访问哪个字段。这意味着访问任何 volatile字段会为所有缓存变量生成障碍。
同步具有类似的功能。