波动与同步在一起

Vla*_*kov 9 java multithreading

有没有理由在此代码中使用volatile和synchronized?

public class Helper {
  private volatile int n;
  private final Object lock = new Object();
  public Helper(int n) {
    this.n = n;
  }

  public void setN(int value) {
    synchronized (lock) {
      n = value;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

类助手必须是线程安全的.我从"Java并发指南"一书中得到了这个例子,但是仍然不清楚:在这个例子中使用volatile和synchronized的原因是什么?

axt*_*avt 7

这个例子的目的是要指出的是,syncronizedvolatile是不够的,在这种情况下,鉴于对象可以被不安全公布(即,没有volatileFoo):

如果Foo类中的辅助字段未声明为volatile,则应将n字段声明为volatile,以便在初始化n和将Helper写入辅助字段之间建立before-before关系.这符合指南"VNA06-J.不要假设声明对象引用volatile会保证第35页的成员可见性.仅当调用者(类Foo)无法信任声明帮助器volatile时才需要这样做.

这是正确的,但他们选择了一个不好的例子来证明它,因为volatile在这种情况下没有同步化就足够了.