nis*_*013 4 java concurrency happens-before
我正在读以下的书
Java Concurrency in Practice http://www.informit.com/store/java-concurrency-in-practice-9780321349606
我对关于Happens-before关系的具体解释感到困惑.
它说,
操作按照之前发生的部分排序进行排序
"偏序"究竟是什么意思?
(书中有一个解释,但我不清楚)
部分排序意味着并非每对操作都具有这种关系happens-before
.
实际上,并非每对操作都具有该关系,这使您可以同时执行操作.
例如,假设您有操作A,B,C和D.
我们可以定义一个部分排序:A must happen before B and C
.
然后A和B具有happens-before
关系,A和C也是如此.但是,A和D没有那种关系,所以D可以在A之前,A之后或A执行时执行.
另一方面,如果happens-before
是一个完整的排序,例如A happens-before B happens-before C happens-before D
(注意,在这种情况下,对于每一对操作,你知道哪一个发生在另一个之前,因此它是一个完整的排序),然后执行操作必须是串行的,并且不可能并发.
由于您指的是 \xe2\x80\x9cJava Concurrency in Practice\xe2\x80\x9d 这本书,我想您正在阅读有关 Java 内存模型的部分。
\n\n对于程序员来说,CPU 按程序\xe2\x80\x99s 语句在源代码中出现的顺序执行与控制流相关的语句似乎很自然。但优化编译器、CPU 架构等几个因素会带来不同的低级行为。然而,这对于执行代码的线程是不可见的。它会表现得好像一切都按顺序发生一样。
\n\n这对于多线程不再适用。当关系存在之前没有发生任何事情时,线程可能会观察到另一个线程的不同顺序的操作。因此,对于这些操作,不存在指定的顺序关系。例如当一个线程执行代码时
\n\nstatic Point XY;\n\xe2\x80\xa6\nXY = new Point(3, 4);\n
Run Code Online (Sandbox Code Playgroud)\n\n另一个线程可能会在该实例的和字段初始化之前观察该Point
实例在字段中的存储,从而看到 (0,0) 或 (3,0) 或 (0,4) 点。XY
x
y
因此,动作 \xe2\x80\x9cAssignment of XY
\xe2\x80\x9d、\xe2\x80\x9cAssignment of x
\xe2\x80\x9d 和 \xe2\x80\x9cAssignment of y
\xe2\x80\x9d之间没有顺序关系读取这些变量的存在。
如果我们将变量声明更改为 易失性,则在存储实例和读取实例引用之间建立发生XY
之前的关系。尽管如此,\xe2\x80\x99s 的写入之间没有顺序,但现在这两个写入都与通过 读取这两个字段有发生之前的关系。Point
XY
x
y
XY
所以 \xe2\x80\x99 是部分排序;有些动作具有顺序关系,有些则没有。
\n