java重新排序和内存模型

vjk*_*vjk 7 java

我在java规范中看到这个:

如果x和y是同一个线程的动作,并且x在程序顺序中出现在y之前,则x发生在y之前.

还有这个

原始代码
线程1
r2 = A;
B = 1;

有效的编译器转换(允许编译器对任一线程中的指令重新排序,当这不影响该线程的独立执行时)
线程1
B = 1;
r2 = A;

我对这两件事很困惑.
如果动作x在动作y之前出现,那么x应该在y之前发生.如果我们认为对于y而言r2 = A而对于y则考虑B = 1,则r2 = A应该在B = 1之前发生.怎么会有任何重新排序,如果在y为真之前x发生,那么在r2 = A之前如何执行B = 1?

Jon*_*eet 13

JLS的第17.4.5节具体说明了这一点:

应该注意的是,两个动作之间存在的先发生关系并不一定意味着它们必须在实现中以该顺序发生.如果重新排序产生的结果与合法执行一致,则不是非法的.

如果它有所帮助,请在规范中的"wurfles"中替换"之前发生的事情",以便您对其含义的直觉不起作用.你怀疑,由于命名,你期望​​在规范中不存在保证.