关于易变和同步

Sam*_*nou 5 java multithreading volatile synchronized

在阅读了关于这个主题的一系列问题/文章之后,我还有一件事情不清楚.

根据我的理解(如果我错了请纠正我)是一个变量的值可以在本地缓存到一个线程,所以如果一个线程更新了该变量的值,这个变化可能对另一个线程不可见.然后使用volatile则基本上强制所有线程从同一位置读取变量的值.此外,关于该主题的所有文献都指出,同步该变量将具有相同的效果.

我的问题是,我读过的任何内容都没有明确指出同步不同的变量会导致同样的行为,但经常会提供一个代码示例,说明在以下两种情况下,从变量读取的值将是最新的:

volatile int x;
...
int y = x;
Run Code Online (Sandbox Code Playgroud)

final Object lock = new Object();
int x;
...
synchronized(lock) {
    int y = x;
}
Run Code Online (Sandbox Code Playgroud)

那么问题是:在任何任意变量上同步会强制同步块中的每个变量访问来访问该变量的最新值吗?

Joh*_*int 5

是这样的情况,同步任何任意变量将强制同步块内的每个变量访问访问该变量的最新值?

只要在同一变量的同步下完成对该变量的写入,就可以同步任何变量进行读取.

在您的示例中,只要发生类似下面的内容,则在写入之后发生的所有写入x将在后续读取后显示:

synchronized(lock){
   x = 10;
}
Run Code Online (Sandbox Code Playgroud)

所以到了你早先的观点:

...我读过的任何内容都没有明确说明同步不同的变量会导致同样的行为......

那是因为它不提供相同的行为.以前发生过的关系有几次发生,在你的情况下有两个重要的关系

  1. 写入并随后读取相同的volatile变量
  2. 监视器在同一对象上的退出和后续输入