当前位置: 首页 > 面试题库 >

Java文档中的易变变量说明

施念
2023-03-14
问题内容

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

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

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

这首先给我的印象是,读取一个volatile变量的线程将与writer线程同步,并等待写入完成。但这显然不是事实。

一个例子将大有帮助,将不胜感激。

谢谢,穆斯塔法


问题答案:

假设您有以下课程:

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(即,如果在读取线程B之前发生了线程A的写操作),那么Java内存模型可以确保分别为b和a显示2和1,因为保证了在写易失性c之前执行的线程A的所有操作对于读取了c的新值的线程是可见的。



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

  • 当线程读取易失性变量时,它不仅会看到易失性的最新更改,还会看到导致更改的代码的副作用 这是在http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html提到的 有人可以举个例子吗? 这首先给我的印象是,读取可变变量的线程将与编写器线程同步,并等待写入完成。但事实显然并非如此。 举个例子会很有帮助,非常感谢。 谢谢,

  • 我最近与一家软件公司进行了一次面试,他问了我以下问题: 你能给我描述一下在变量前面添加volatile有什么作用吗?你能给我解释一下为什么这很重要吗? 我的大部分编程知识都来自C语言,但我的工作岗位是C#(我想如果需要的话,我可以特别为这个问题添加一些信息)

  • 以下是经典的实践中的一致性: 当线程A写入一个易失性变量,随后线程B读取相同的变量时,A在写入易失性变量之前可见的所有变量的值在读取易失性变量后变得对B可见。 我不确定我真的能理解这句话。例如,在这种情况下,所有变量的含义是什么?这是否意味着使用对使用非volatile变量也有副作用<在我看来,这句话有一些我无法理解的微妙含义<有什么帮助吗?

  • 问题内容: 我想加载模板Word文档以向其添加内容并另存为新文档。我正在处理.doc文件。 经过长时间的研究,我仅找到docx的解决方案: http://www.smartjava.org/content/create-complex-word-docx-documents- programatically-docx4j http://www.sambhashanam.com/mail-merge

  • 我想加载一个模板word文档以添加内容并另存为新文档。我在处理.文件。 经过长时间的研究,我只找到了docx的解决方案: 所以我想用它的值替换以这种格式编写的任何变量:。我可以用velocity或Apache-poi来做它,什么是它的最佳解决方案。任何帮助都将不胜感激。