考虑一下volatile int sharedVar.我们知道JLS为我们提供了以下保证:
w其写入值之前i以sharedVar程序顺序happens-before写入动作;i通过w happens-before的成功读取i从sharedVar由读取线程r;i从sharedVar由读线程r happens-before的所有后续行动r的程序顺序.然而,仍有给出没有挂钟时间的保证,当读线程将观察值i.一个完全不会让读取线程看到该值的实现仍然符合此契约.
我已经考虑了一段时间,我看不到任何漏洞,但我认为必须有.请指出我的推理漏洞.
我在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?