Java - 同步时是否需要volatile?

Bob*_*r02 4 java multithreading locking volatile memory-model

在以下简单场景中:

class A {
  int x;
  Object lock;

  ...

  public void method(){
    synchronized(lock){
      // modify/read x and act upon its value
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

x需要变化吗?我知道同步保证原子性,但我不确定可见性虽然...确实锁定 - >修改 - >解锁 - >锁定保证,在第二次锁定后,x的值将是"新鲜"?

Eug*_*ene 8

不,它没有,synchronized已经在它之后插入了一个内存屏障,所以所有线程都将看到当前线程执行的更新,同时考虑到其他线程将在同一个锁上同步.

易失性,就像synchronized一样,它有附加的内存屏障 - 取决于它是存储/加载/完全屏障的cpu,确保一个线程的更新对其他线程可见.我假设这是使用cpu cache invalidation执行的.

编辑 从我刚刚阅读的内容来看,存储缓冲区被刷新到CPU缓存,这就是实现可见性的方式.