Java - 同步时是否需要volatile?

时间:2014-04-04 12:00:04

标签: 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
    }
  }
}

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

2 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:2)

简化回答:如果线程A更新一个字段然后释放一个锁,那么线程B将保证在线程B获得相同的锁之后看到更新。

注意,"释放锁定"表示退出synchronized块,并且"获取相同的锁定"意味着在同一个对象上同步。