如果从2个线程写入volatile变量会发生什么?

Shi*_*han 6 java multithreading volatile

考虑Java Concurrency in Practice中的片段-

@ThreadSafe
public class SynchronizedInteger{
    @GuardedBy("this") private int value;

    public synchronized int getValue() {
        return value;
    }

    public synchronized void setValue(int value) {
        this.value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

来自同一本书的摘录 -

考虑volatile变量的好方法是想象它们的行为大致类似于上面列出的SynchronizedInteger类,用get和set调用替换volatile变量的读写.然而,访问volatile变量不会执行锁定,因此不会导致执行线程阻塞,从而使volatile变量的同步机制比同步更轻.

线程限制的特殊情况适用于volatile变量.只要确保volatile变量仅从单个线程写入,就可以安全地对共享的volatile变量执行读 - 修改 - 写操作.

因此,如果您将上述类中的实例变量设置为volatile,然后删除synchronized关键字,那么假设有3个线程

线程A和线程B正在写入相同的volatile变量.
线程C读取volatile变量.

由于volatile变量现在是从2个线程写入的,为什么对这个共享的volatile变量执行读 - 修改 - 写操作是不安全的?

小智 4

该关键字volatile用于确保对您的更改Object将被其他人看到Thread。这并不强制要求在操作完成之前Object执行非原子操作而不会受到其他干扰。Thread为了强制执行此操作,您将需要关键字synchronized