经过James Gosling的JLS,我发现了这个 -
Java编程语言提供第二机制(同步除外),易失性字段,这比出于某些目的的锁定更方便
字段可以声明为 volatile ,在这种情况下, Java内存模型可确保所有线程看到一致的值< / strong>对于变量。然后作者指向this资源。
似乎结果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,在指令3之前,在指令4之前。 从表面上看,这是荒谬的。
但是,允许编译器对其中的指令重新排序 线程,当这不影响该线程的执行时 隔离。如果指令1与指令2重新排序,则如图所示 在表17.4-B的迹线中,则很容易看出结果r2如何 == 2和r1 == 1可能会发生。
请举例说明。
答案 0 :(得分:0)
这是英语写作中常见的修辞模式。一位作家说,某些事情可能会出现&#34;是这样的,或者说某人可能会想到&#34;事情就是这样,他们解释了可能导致这个结论的无效推理,然后他们继续解释事实并非如此。使用这种修辞技巧,中间部分由作者所知的不正确的陈述组成。
您引用的部分旨在准确解释您已经理解的内容 - 编译器通常可以自由地重新排序内存读取和写入,如果它们不会影响单线程代码。
例如,在本段中:
可能出现结果r2 == 2且r1 == 1是不可能的。直观地说,指令1或指令3应该在执行中首先出现。如果指令1首先出现,它应该不能在指令4处看到写入。如果指令3先出现,它应该不能在指令2处看到写入。
可能出现&#34;&#34;他的意思是有人可能会想到它,但事实并非如此。然后,他继续解释为什么有人会这么想,然后解释为什么会出错。这一段中第一个之后的句子被作者认为是错误的,然后他将继续解释它们是如何错误的。