考虑 Java 并发实践中的片段-
@ThreadSafe
public class SynchronizedInteger{
@GuardedBy("this") private int value;
public synchronized int getValue() {
return value;
}
public synchronized void setValue(int value) {
this.value = value;
}
}
同一本书的摘录-
A good way to think about volatile variables is to imagine that they behave roughly like the SynchronizedInteger class in Listing above, replacing reads and writes of the volatile variable with calls to get and set. Yet accessing a volatile variable performs no locking and so cannot cause the executing thread to block, making volatile variables a lighter-weight synchronization mechanism than synchronized.
线程限制的一个特例适用于 volatile 变量。只要确保volatile 变量仅从单个线程写入,就可以安全地对共享的 volatile 变量执行读取-修改-写入操作。
所以,如果你把上面类中的实例变量设为volatile,然后去掉synchronized关键字,之后假设有3个线程
线程 A 和线程 B 正在写入同一个 volatile 变量。
线程 C 读取 volatile 变量。
既然 volatile 变量现在是从 2 个线程写入的,为什么对这个共享的 volatile 变量执行读-修改-写操作是不安全的?
最佳答案
关键字 volatile
用于确保对您的 Object
的更改将被其他 Thread
看到。
这并不强制执行 Object
上的非原子操作,而不会在操作完成之前受到其他 Thread
的干扰。
为了强制执行此操作,您将需要关键字 synchronized
。
关于java - 如果从 2 个线程写入 volatile 变量会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38793660/