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

Java中的易变变量

钱建本
2023-03-14
问题内容

因此,我正在阅读《 实践 中的 Java并发性》 这本书,而我只能停留在这一解释上,没有一个例子,我似乎无法理解。这是报价:

当线程A将数据写入易失性变量,然后线程B 读取同一变量时,在A写入易失性变量之前可见的所有变量的值 将B在读取易失性变量后变为可见。

有人可以给我一个反例的原因,为什么“在A写入易失性变量之前可见的所有变量的值在B读取易失性变量之后就变得可见”?

我很困惑,为什么B在读取易失性变量之前所有其他非易失性变量都不可见?


问题答案:

线程B可能具有这些变量的CPU本地缓存。读取volatile变量可确保观察到从先前对volatile的任何中间刷新。

例如,请阅读以下链接,该链接以“使用易失性修复双重检查锁定”结尾:

http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html



 类似资料:
  • 问题内容: 当线程读取一个volatile变量时,它不仅看到volatile的最新更改,还看到导致该更改的代码的副作用 在http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html中提到了这一点 有人可以提供一个例子吗? 这首先给我的印象是,读取一个volatile变量的线程将与writer线程同步,并等待写入完

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

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

  • 问题内容: 我对关于volatile关键字在Java中的应用的了解感到非常困惑。 以下陈述正确吗?“对易失性字段的写操作在每次随后读取相同字段之前发生” 理想情况下,何时应使用volatile关键字? 之间有什么区别? 和 问题答案: volatile 是 字段修饰符 ,而 sync则 修饰 代码块 和 方法 。因此,我们可以使用这两个关键字来指定简单访问器的三种变体: 访问当前存储在当前线程中的

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

  • 问题内容: 我想说明 先发生的 关系如何与 volatile 变量一起使用。让我们有以下变量: 和线程A: 和线程B: 根据Java内存模型(JMM),以下语句正确吗? 如果没有,正确的解释是什么? 总是在 发生之前 __仅在JMM中实际发生时才 发生- 在JMM中 __ 如果实际上发生在时间之前,则发生在JMM中-before -before (并且将可预测地分配) 否则,和之间的顺序不确定,并