首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的易失变量

Java中的易失变量
EN

Stack Overflow用户
提问于 2011-06-07 01:17:31
回答 5查看 15.2K关注 0票数 23

因此,我正在阅读这本书,名为Java并发在实践中,我被困在这个解释,我似乎无法理解,没有一个例子。以下是这段话:

当线程A写入易失性变量并随后线程B读取该变量时,在写入易失性变量之前对A可见的所有变量的值在读取易失性变量后对B变得可见。

有人能给我一个反例说明为什么“在写入易失性变量之前对A可见的所有变量的值在读取易失变量后对B都是可见的”吗?

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-06-07 01:21:41

线程B可能有这些变量的CPU本地缓存。对易失性变量的读取确保从对易失性的前一次写入中看到的任何中间缓存刷新。

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

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

票数 15
EN

Stack Overflow用户

发布于 2011-06-07 01:20:19

声明易失性Java变量意味着:

  • 这个变量的值永远不会被缓存的线程本地:所有的读和写将直接进入“主内存”。
  • 对变量的访问就像它被封装在一个同步块中一样,在它本身上是同步的。

仅供参考,什么时候需要易失性?

当多个线程使用相同的变量时,每个线程都将拥有该变量的本地缓存的副本。因此,当它更新值时,它实际上是在本地缓存中更新的,而不是在主变量内存中。使用相同变量的另一个线程不知道其他线程更改的值。为了避免此问题,如果您将一个变量声明为易失性变量,则它将不会存储在本地缓存中。每当线程更新这些值时,都会将其更新到主内存。因此,其他线程可以访问更新的值。

JLS§17.4.7格式良好的执行

我们只考虑行刑。如果下列条件成立,则执行E=< P、A、po、so、W、V、sw、hb >的格式良好:

  1. 每次读取都会在执行过程中看到对同一个变量的写入。所有对易失性变量的读写都是易失性操作。对于A中的所有读取r,A中有W(r),W(r).v = r.v。变量r.v是易失性的当且仅当r是易失读,变量w.v是易失性的当且仅当w是易失性写入。
  2. 发生-之前的秩序是一个部分秩序。在同步的传递闭包给出顺序之前,使用边和程序顺序发生。它必须是一个有效的偏序:自反,传递性和反对称。
  3. 执行遵循线程内一致性。对于每个线程t,t在A中执行的操作与该线程按程序顺序单独生成的操作相同,每个线程都写入值V(w),假设每个读r都看到值V(W(r))。每个读取所看到的值由内存模型确定。给定的程序顺序必须反映根据P的线程内语义执行操作的程序顺序。
  4. 执行是在一致之前发生的(第17.4.6节)。
  5. 执行遵循同步顺序一致性。对于A中所有易失性读取r,都不是这样(r,W( r) )或存在写win A以致w.v = r.v和so(W(r),w)和so(w,r)的情况。

有用的链接:关于Java中的非阻塞并发性,我们到底知道些什么?

票数 25
EN

Stack Overflow用户

发布于 2011-06-07 01:49:30

如果一个变量是非易失性的,那么编译器和CPU可以根据他们认为合适的情况自由地重新排序指令,以便优化性能。

如果变量现在被声明为可变变量,那么编译器就不再试图优化对该变量的访问(读和写)。但是,它可能继续优化其他变量的访问。

在运行时,当访问易失性变量时,JVM向CPU生成适当的内存屏障指令。内存屏障具有同样的目的-- CPU也可以防止重新排序指令.

当一个易失性变量被写入(通过线程A)时,对任何其他变量的所有写入都完成(或至少看起来是这样),并且在写入易失性变量之前使A可见;这通常是由于内存写屏障指令。同样,对其他变量的任何读取都将在读取(线程B)之前完成(或看起来是);这通常是由于内存读取障碍指令。这种由屏障强制执行的指令排序,将意味着所有对A可见的写入都将是可见的。然而,这并不意味着没有发生任何指令的重新排序(编译器可能对其他指令执行了重新排序);它仅仅意味着,如果任何对A可见的写入发生了,则对B是可见的。简单地说,这意味着严格的程序顺序不被维护。

如果您想更详细地了解JVM是如何发出内存障碍指令的,我将在内存屏障和JVM并发上指出这篇文章。

相关问题

  1. 什么是记忆栅栏?
  2. 处理器用于优化代码的一些技巧是什么?
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6259745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档