当线程读取 volatile 变量时,它不仅会看到 volatile 的最新更改,还会看到导致更改的代码的副作用
这在http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html中提到
有人可以提供一个例子吗?
这首先给我的印象是,读取 volatile 变量的线程将与写入线程同步并等待直到写入完成。但显然情况并非如此。
一个例子会有很大帮助,非常感谢。
谢谢,穆斯塔法
当线程读取 volatile 变量时,它不仅会看到 volatile 的最新更改,还会看到导致更改的代码的副作用
这在http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html中提到
有人可以提供一个例子吗?
这首先给我的印象是,读取 volatile 变量的线程将与写入线程同步并等待直到写入完成。但显然情况并非如此。
一个例子会有很大帮助,非常感谢。
谢谢,穆斯塔法
假设您有以下课程:
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 的新值的线程可见。
据我了解文档的文本,如果将volatile修饰符应用于该字段,则它保证以下内容:如果代码中的volatile字段发生更改,则此更改将发生在它之前的所有操作之后,并且在所有操作之前操作,跟随它,这将是所有应用程序线程的情况。