2

通过 James Gosling 的JLS,我遇到了这个 -

Java 编程语言提供了第二种机制(除了同步之外),易失字段,在某些情况下它比锁定更方便。

一个字段可能被声明为volatile,在这种情况下,Java 内存模型确保所有线程都看到变量的一致值。然后作者指向这个资源。

在此处输入图像描述

看来,结果r2 == 2r1 == 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 是如何发生的。

请举例说明。

4

1 回答 1

0

这是英语写作中常见的修辞模式。一位作家说某事“可能看起来”是这样,或者说某人“可能认为”某事是这样,他们解释了可能导致该结论的无效推理,然后他们继续解释事实并非如此案子。使用这种修辞技巧,中间部分由作者已知不正确的陈述组成。

您引用的部分旨在准确解释您已经理解的内容 - 如果编译器不能影响单线程代码,编译器通常可以自由地重新排序内存读取和写入。

例如,在本段中:

看起来结果r2 == 2 和 r1 == 1 是不可能的。直观地说,指令 1 或指令 3 应该在执行中首先出现。如果指令 1 先到,它应该看不到指令 4 的写操作。如果指令 3 先到,它应该看不到指令 2 的写操作。

“可能出现”是指有人可能会这么想,但事实并非如此。然后他继续解释为什么有人会这么想,然后解释为什么这是错误的。该段中第一个句子之后的句子被作者知道是错误的,然后他将继续解释它们是如何错误的。

于 2016-07-28T18:42:06.570 回答