首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新排序挥发场周围的正常场

重新排序挥发场周围的正常场
EN

Stack Overflow用户
提问于 2011-02-07 08:49:34
回答 5查看 1K关注 0票数 3

基于

易失性会做什么?http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#incorrectlySync

易失性http://www.ibm.com/developerworks/library/j-jtp03304/的新保证

代码语言:javascript
复制
class VolatileExample {
  int x = 0;
  volatile boolean v = false;
  public void writer() {
    x = 42;
    v = true;
  }

  public void reader() {
    if (v == true) {
      //uses x - guaranteed to see 42.
    }
  }
}

看起来是这样。

代码语言:javascript
复制
1a) write to non-volatile variable x 
1b) write to volatile variable v

1a不能通过1b

我在想,如果我将源代码修改为以下内容

代码语言:javascript
复制
class VolatileExample {
  int x = 42;
  volatile boolean v = true;
  public void writer() {
    v = false;
    x = 0;
  }

  public void reader() {
    if (v == true) {
      //uses x - guaranteed to see 42?????
    }
  }
}

下面的序列可以被置换吗?

代码语言:javascript
复制
2a) write to volatile variable v
2b) write to non-volatile variable x

我在想,2b能在2a之前移动吗?这是因为如果2b能够在2a之前移动,读者就不能保证在if块中看到42。

I感到2b可以根据以下信息在2a之前移动。

http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#reordering

对易失性字段的写入与监视器释放具有相同的存储效果,而从易失性字段的读取具有与监视器获取相同的存储效果。

这意味着,线程退出同步块之前对线程可见的任何内存操作,在任何线程进入受同一监视器保护的同步块后都是可见的,因为所有内存操作都发生在释放之前,而释放发生在获取之前。

Roach汽车旅馆与Java内存模型

代码语言:javascript
复制
volatile_v = true;      <-- monitor release
non_volatile_x = 42;
(volatile_v will act as a roach motels, and it is fine for non_volatile_x to move into roach motels)


non_volatile_x = 42;
volatile_v = true;      <-- monitor release
(volatile_v will act as a roach motels, and it is not OK for non_volatile_x to move out from roach motels)
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-08 00:53:15

我们知道,对易失变量的写入不能相对于以前的任何读或写重新排序(如Java5),但情况并非如此。因此,按照我的理解,将程序重新排序为x= 0;v= false;是正确的。

在我们写到v之后,我们保证当阅读v时,在写v之前发生的每一个动作都是可见的,但是它没有提到写到v之后的任何动作--这些操作可能已经发生,也可能没有发生,甚至可以在v被写入之前被重新排序。

票数 1
EN

Stack Overflow用户

发布于 2011-02-07 09:44:49

有两个部分不稳定,指令的顺序和“冲洗”的写作。

指令的顺序不会改变,但是两段代码之间可能会有任何延迟,所以在第二种情况下,它可能是42,但可能是0。我猜你会经常看到0。

根据您的体系结构,这可能比其他系统更有可能发生,所以在一台机器上测试它,发现它是42,并不意味着它总是在另一台机器上。

票数 0
EN

Stack Overflow用户

发布于 2011-02-07 10:27:21

正如我所理解的新内存模型,一旦一个易失性值被刷新到主内存,所有其他可以被刷新线程看到的变量也必须被刷新。但其结果是,VM不能将2b重新排序到2a之前,因为这将违反代码中隐含的“发生前”顺序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4919392

复制
相关文章

相似问题

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