java - 如果从 2 个线程写入 volatile 变量会怎样?

标签 java multithreading volatile

考虑 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/

相关文章:

.net - 如何实现单例 .NET 组件以供多个进程使用?

c++ - 一切都不稳定

java - 打开终端/提示符并传递命令 (ping)

java - 将资源添加到从项目创建的库中

java - 如何通过j2me api解析包含负数的字符串?

python - 为什么多线程和不同的函数/范围共享单个导入过程

multithreading - 我如何在 ghc-7.4 中使用带有 gtk2hs 的线程?

java - 为什么在 Facebook YearClass 中声明非线程 - volatile 参数

c++ - volatile struct = struct 不可能,为什么?

java - 从 RSS 新闻描述标签中删除 HTML 格式信息