我在读Java并发在实践中的应用
我对发生在关系之前的具体解释感到困惑。
它说,
操作由偏序进行排序,称为发生之前。
“偏序”到底是什么意思?
(书中有一个解释,但我不太清楚)
发布于 2013-10-01 16:18:33
偏序意味着并不是每一对操作都有关系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 (请注意,在本例中,对于您知道发生的每一对操作-在另一对操作之前,因此是完全排序),则操作的执行必须是串行的,并且不可能并发。
发布于 2013-10-01 22:09:22
由于您所指的是“实际中的Java并发性”一书,我想您是在讨论Java内存模型的部分。
对于程序员来说,CPU按照源代码中有关控制流的顺序执行程序的语句是很自然的。但是,一些因素,如优化编译器、CPU体系结构等,会造成不同的低级别行为。但是,对于执行代码的线程来说,这是不可见的。它会表现得好像一切都井井有条。
这不再适用于多个线程。当关系存在之前没有发生时,线程可能会观察到另一个线程的操作顺序不同。因此,对于这些操作,不存在指定的排序关系。例如,当线程执行代码时
static Point XY;
…
XY = new Point(3, 4);另一个线程可能在初始化该实例的Point和y字段之前将该x实例存储到XY字段中,从而看到一个(0,0)或(3,0)或(0,4)点。
因此,操作“XY的赋值”、“x的赋值”和“y的赋值”与读取这些变量之间不存在排序关系。
如果我们将变量声明XY更改为易失性,则会在将Point实例存储到XY和读取该实例引用之间建立关系之前发生。不过,x和y的写入之间没有顺序,但现在这两种写入都发生了--在通过XY读取这两个字段之前。
这就是偏序,有些行为有排序关系,而另一些则没有。
https://stackoverflow.com/questions/19120979
复制相似问题