当前位置: 首页 > 知识库问答 >
问题:

Java文档中的易失性变量解释

贺福
2023-03-14

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

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

有人可以举个例子吗?

这首先给我的印象是,读取可变变量的线程将与编写器线程同步,并等待写入完成。但事实显然并非如此。

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

谢谢,穆斯塔法

共有2个答案

万俟靖
2023-03-14

按照我对文档文本的理解,如果将volatile修饰符应用于字段,那么它保证了以下几点:如果在代码中更改了volatile-field,那么这种更改将在它之前的所有操作之后发生,在它之后的所有操作之前发生,这将适用于所有应用程序线程。

马高谊
2023-03-14

假设您有以下类:

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的最新更改,还看到导致该更改的代码的副作用 在http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html中提到了这一点 有人可以提供一个例子吗? 这首先给我的印象是,读取一个volatile变量的线程将与writer线程同步,并等待写入完

  • 所有的中断函数都能正常工作,但是过程函数却让我很生气。 我会感激任何我没注意的把戏。

  • 谢谢,伊利亚

  • 问题内容: 因此,我正在阅读《 实践 中的 Java并发性》 这本书,而我只能停留在这一解释上,没有一个例子,我似乎无法理解。这是报价: 当线程将数据写入易失性变量,然后线程 读取同一变量时,在写入易失性变量之前可见的所有变量的值 将在读取易失性变量后变为可见。 有人可以给我一个反例的原因,为什么“在写入易失性变量之前可见的所有变量的值在读取易失性变量之后就变得可见”? 我很困惑,为什么在读取易失

  • 我已经读到,使引用变量易失性,并不会使其内部字段易失性。但我尝试了下面的示例,其中看起来易失性也应用于类的内部字段。 使用者java:-//字段“flag”设置为true的用户类。 MyRunnableThread1。java:- 在这里,我将“user”设置为volatile,而不是将其内部字段“flag”设置为volatile 子线程在“while(this.user.isFlag())”处连

  • 我想澄清发生前关系是如何与不稳定变量一起工作的。让我们有以下变量: 和线程A: 和线程B: 根据Java内存模型(JMM),以下语句是否正确?如果不是,正确的解释是什么? 总是发生-之前 在JMM中发生在之前,只有当它实际发生在时间之前 在JMM中发生在之前(并且将被可预测地分配)如果实际发生在