通过 James Gosling 的JLS,我遇到了这个 -
Java 编程语言提供了第二种机制(除了同步之外),易失字段,在某些情况下它比锁定更方便。
一个字段可能被声明为volatile,在这种情况下,Java 内存模型确保所有线程都看到变量的一致值。然后作者指向这个资源。
看来,结果r2 == 2
又r1 == 1
是不可能的。
但为什么?
考虑这样的事情不是很有意义吗-
Instruction 4 : A = 2;
Instruction 1 : r2 = A;
Instruction 2 : B = 1;
Instruction 3 : r1 = B;
其余的我也无法理解。
看起来结果 r2 == 2 和 r1 == 1 是不可能的。直观地说,指令 1 或指令 3 应该在执行中首先出现。如果指令 1 先到,它应该看不到指令 4 的写操作。如果指令 3 先到,它应该看不到指令 2 的写操作。
如果某个执行表现出这种行为,那么我们就会知道指令 4 出现在指令 1 之前,指令 1 出现在指令 2 之前,指令 2 出现在指令 3 之前,指令 3 出现在指令 4 之前。从表面上看,这是荒谬的。
但是,允许编译器对任一线程中的指令重新排序,只要这不会影响该线程的单独执行。如果指令 1 与指令 2 重新排序,如表 17.4-B 中的跟踪所示,那么很容易看出结果 r2 == 2 和 r1 == 1 是如何发生的。
请举例说明。