6

当线程读取 volatile 变量时,它不仅会看到 volatile 的最新更改,还会看到导致更改的代码的副作用

这在http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html中提到

有人可以提供一个例子吗?

这首先给我的印象是,读取 volatile 变量的线程将与写入线程同步并等待直到写入完成。但显然情况并非如此。

一个例子会有很大帮助,非常感谢。

谢谢,穆斯塔法

4

2 回答 2

11

假设您有以下课程:

public class Shared {
    public int a;
    public int b;
    public volatile int c;
}

现在假设线程 A 引用了这个类的一个实例并且确实

shared.a = 1;
shared.b = 2;
shared.c = 3;

假设线程 B 引用了同一个实例并且确实

display(c);
display(b);
display(a);

然后,如果 c 显示的值为 3(即如果线程 A 的写入发生在线程 B 的读取之前),那么 Java 内存模型保证 b 和 a 也将分别显示 2 和 1,因为线程 A 在写入 volatile c 之前所做的所有操作都保证对已读取 c 的新值的线程可见。

于 2013-11-02T07:56:44.853 回答
0

据我了解文档的文本,如果将volatile修饰符应用于该字段,则它保证以下内容:如果代码中的volatile字段发生更改,则此更改将发生它之前的所有操作之后,并且所有操作之前操作,跟随它,这将是所有应用程序线程的情况。

于 2022-01-20T14:42:02.653 回答