【问题标题】:Volatile variable explanation in Java docsJava 文档中的可变变量解释
【发布时间】:2013-11-02 03:24:25
【问题描述】:

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

http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html提到了这一点

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

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

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

谢谢, 穆斯塔法

【问题讨论】:

  • Volatile fields do 建立synchronization order:“对 volatile 变量 v 的写入(第 8.3.1.4 节)与任何线程对 v 的所有后续读取同步(其中“后续”是根据同步顺序定义的)。但是,这并不意味着任意写入将发生在任意读取之前(顺序被确定为写入的结果)。

标签: java multithreading volatile


【解决方案1】:

假设您有以下课程:

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 也将显示 2 和 1 并且a,因为线程 A 在写入 volatile c 之前所做的所有操作都保证对读取 c 的新值的线程可见。

【讨论】:

  • 谢谢。这句话现在更有意义了。现在我的目的已经达到了。穆什表示赞赏。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-13
    • 2016-01-05
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2013-08-02
    相关资源
    最近更新 更多