gpt4 book ai didi

java - 同步 (SW) 顺序与同步顺序 (SO)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:10:29 26 4
gpt4 key购买 nike

此处:http://cs.oswego.edu/pipermail/concurrency-interest/2013-November/011954.html其中一位对话者说:

In your reasoning, you do not distinguish between synchronization order (so) and synchronizes-with order (sw)

我也看不出 so 和 sw 之间的区别。有人可以解释一下吗?


EDITED_1:

   read(a, !null) (1)
\--po--> vread(a.f, 0)
\---so---> vstore(a.f, 42)
\---po---> store(a) (4)

特别是,我不明白上面的图:read(a, !null)(1) 表示 action read a 而它不是-null 而作为操作 (4) store(a) 存储到 a 变量 after (1)。

所以,如果我们有:

read(a) --> store_to_a read(a) 如何返回 not null?


EDITED_2我不明白:

   vstore(A.f, null) --so--> vread(A.f, null) --so--> vstore(A.f, 42)

vstore(A.f, null) 是什么意思。我的意思是 A.f 是一个 int。那么,为什么作者将null存储到int中呢?与 vread(A.f, null)

相同

最佳答案

同步顺序是每个单独执行的属性,它是该执行上所有同步操作的顺序。

Synchronizes-with 是一种部分基于同步顺序的关系(参见 JLS 17.4.4)。

特别是,此帖子所回应的假设是volatile-read(a.f)volatile-write(a.f)< 之间存在sw 关系/em>:没有这样的关系,执行只是恰好让这两个 Action 按照同步顺序相互跟随,但是由于没有sw关系,所以有不需要引入适当的栅栏(事实上,在某些系统上,您可能有一个 read-acquire 后跟一个 store-release,它们不按该顺序同步),或者,从另一个角度来看,没有happens-before,所以存在数据竞争,实际行为是任何人的猜测,而volatile-read( a.f) 在不违反 JLS 17 中的任何内容的情况下读取 0。

对编辑 1 的回答

   read(a, !null) (1)
\--po--> vread(a.f, 0)
\---so---> vstore(a.f, 42)
\---po---> store(a) (4)

Particullary, I don't undertand the above diagram: read(a, !null)(1) means that action read a and it is not-null whileas an action (4) store(a) stored to the a variable after (1).

操作 4 发生在与操作 1 不同的线程中。由于 f 不是最终字段,并且 store(a) 不是 volatile 写入,受 a 保护monitor, ... 没有任何东西强制订阅线程按顺序查看 vstore(a.f, 42)store(a)。例如store(a) 可以在 vstore(a.f, 42) 之前转发到另一个 CPU。

换句话说,该图具有误导性,最好分解为:

Synchronization Order:
vread(a.f, 0) ---so---> vstore(a.f, 42)
Program Order in publishing thread:
vstore(a.f, 42) ---po---> store(a)
Program Order in subscribing thread:
read(a, !null) ---po---> vread(a.f, 0)

仅当程序无竞争时才使用单个图表才有意义,这意味着所有执行都需要看起来顺序一致 ,这看起来像是简单的线程交错。在没有 DRF-SC(数据竞争自由 - 顺序一致)行为的情况下,事情并没有那么简单。即便如此,我还是建议使用单独线程的图表,如下所示:

Publishing thread       Subscribing thread

read(a, !null)
|
po
|
v
vread(a.f, 0)
/
so
/
v
vstore(a.f, 42)
|
po
|
v
store(a)

happens-before 顺序仅由两个线程的intra-thread program-order 组成,没有线程间 排序完全同步。特别是,vread(a.f, 0)vstore(a.f, 42) 之间没有happens-before 关系,因此有数据竞争,并且并非程序的所有执行都需要看起来顺序一致

对编辑 2 的回答

What does it mean vstore(A.f, null). I mean A.f is an int. So, why the author stores null to int? The same with vread(A.f, null)

在这种情况下,作者使用null 来表示字段的默认值。这只是符号,不要读太多。

关于java - 同步 (SW) 顺序与同步顺序 (SO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46061680/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com