【发布时间】:2016-12-12 03:07:54
【问题描述】:
考虑 Java 并发实践中的 sn-p-
@ThreadSafe
public class SynchronizedInteger{
@GuardedBy("this") private int value;
public synchronized int getValue() {
return value;
}
public synchronized void setValue(int value) {
this.value = value;
}
}
同一本书的摘录-
考虑 volatile 变量的一个好方法是想象它们 行为大致类似于上面清单中的 SynchronizedInteger 类, 用 get 调用替换 volatile 变量的读取和写入 并设置。然而访问 volatile 变量不会执行锁定,因此 不能导致执行线程阻塞,使变量易变 一种比 synchronized 更轻量级的同步机制。
线程限制的一种特殊情况适用于 volatile 变量。只要确保 volatile 变量仅从单个线程写入,对共享 volatile 变量执行读-修改-写操作是安全的。
所以,如果你把上面类中的实例变量设置为 volatile,然后去掉 synchronized 关键字,之后假设有 3 个线程
线程 A 和线程 B 正在写入同一个 volatile 变量。
线程 C 读取 volatile 变量。
既然 volatile 变量现在是从 2 个线程写入的,为什么对这个共享的 volatile 变量执行 read-modify-write 操作是不安全的?
【问题讨论】:
标签: java multithreading volatile