Subtle moments in Happens-Before relationship

时间:2017-02-23 10:15:56

标签: java java-memory-model

This question concerns JMM: https://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf

请您解释一下JMM规范中的以下表达式(这是第13页的第5节):

  

更具体地说,如果两个动作共享发生在之前的关系,   它们不一定必须按顺序发生   他们不与之分享的任何代码   关系。写入与读取数据竞争中的一个线程   例如,在另一个线程中,可能看起来不按顺序发生   那些读物。

如果可能,请提供反映此问题的执行跟踪。

1 个答案:

答案 0 :(得分:0)

你引用的段落前面的段落已经说过,一个动作a与一个动作b之前发生过关系的事实并不意味着a在b之前真的被执行了。例如,在代码段

x = 10;
y = 20;

两个写入操作处于before-before关系中,因为它们出现在同一个线程中。但是,它们实际上可能被交换(由编译器,JVM或甚至处理器),因为无法从线程本身内部进行交换。

但是,它可以被另一个线程观察到(这是Java内存模型特别允许的)。因此,在没有某种形式的同步的情况下读取这两个变量的另一个线程可能会观察到在x变为10之前y被更改为20.(同步的缺失确保了写入与数据竞争中的读取其他线程。)