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的原因是什么?
这个例子的目的是要指出的是,syncronized不volatile是不够的,在这种情况下,鉴于对象可以被不安全公布(即,没有volatile在Foo):
如果Foo类中的辅助字段未声明为volatile,则应将n字段声明为volatile,以便在初始化n和将Helper写入辅助字段之间建立before-before关系.这符合指南"VNA06-J.不要假设声明对象引用volatile会保证第35页的成员可见性.仅当调用者(类Foo)无法信任声明帮助器volatile时才需要这样做.
这是正确的,但他们选择了一个不好的例子来证明它,因为volatile在这种情况下没有同步化就足够了.
| 归档时间: |
|
| 查看次数: |
1134 次 |
| 最近记录: |