【问题标题】:What does "synchronization actions are totally ordered" mean?“同步动作完全有序”是什么意思?
【发布时间】:2020-01-24 12:37:16
【问题描述】:

我正在阅读 Java Concurrency in Practice,在“16.1.3 The Java Memory Model in 500 words or less”中,它说:

Java 内存模型是根据操作指定的,包括对变量的读取和写入、监视器的锁定和解锁,以及启动和加入线程。 JMM 为程序内的所有动作定义了一个名为happens-before 的部分排序 以保证执行动作 B 的线程可以看到动作 A 的结果(无论是否A 和 B 发生在不同的线程中),则 A 和 B 之间必须存在happens-before 关系。在两个操作之间没有happens-before 排序的情况下,JVM 可以随意对它们进行重新排序。

即使动作只是部分排序的,同步动作——锁的获取和释放,以及 volatile 变量的读取和写入——是完全排序的用“后续”锁定获取和 volatile 变量读取来描述发生前发生。

关于“偏序”,我找到了thisthis,但是我不太明白“虽然动作只是偏序,但同步动作——锁的获取和释放,读取和volatile 变量的写入——完全有序。”“同步动作是完全有序的”是什么意思?

【问题讨论】:

  • 部分排序,A必须在B之前:ACDB。总订购量:ABCD
  • @Michael 我还是不明白同步动作总排序是什么关系,能举个例子吗?
  • 您阅读了本章的其余部分吗?我不记得内容的具体细节,但您似乎是在说您不理解什么是故意的 tl;dr 摘要,而没有阅读随后的 16 页解释。
  • 问题中列出了确切的同步操作。 JVM 不能对它们重新排序——它们必须在你的代码中的另一个中执行。你到底有什么不明白的地方?
  • @Michael 不,我没有,我会阅读重置。

标签: java multithreading happens-before


【解决方案1】:

分析“同步动作是完全有序的”语句:

  • “同步动作”是一组S的程序操作(动作)
  • 我们有一个关系R over set S:它是happens-before关系。也就是说,给定程序语句abaRb 当且仅当a 发生在b 之前。

那么语句所说的是“关系Rtotal超过S”。


“关系R 总和超过S”,表示对于集合S(与a!=b)中的每两个操作a,baRbbRa。也就是说,要么ahappens-before b,要么bhappens-beforea


如果我们将集合S定义为对同一个锁对象X执行的所有锁获取和锁释放的集合;那么集合S完全由happens-before关系排序的:让a获取锁X由线程T1执行,b执行锁获取通过线程T2。然后ahappens-beforeb(如果T1先获取锁。T1需要先释放锁,然后T2才能获取);或 bhappens-before a(以防 T2 先获取锁)。


注意:并非所有关系都是完全的。

例如,关系<= 是实数的总和。也就是说,对于每对a,b 实数,a<=bb<=a 都是真的。这里的总顺序意味着给定 any 两个项目,我们总是可以决定哪个先出现。给定的关系。

但是关系P:“是”的祖先,并不是所有人类集合的总关系。当然,对于某些人 a,baPbab 的祖先)或 bPaba 的祖先)是真的。但对于他们中的大多数人来说,aPbbPa 都不是真的;也就是说,我们不能使用关系来决定哪个项目“首先”出现(在系谱学术语中)。

回到程序语句,happens-before 关系 R 显然是部分的,在 all 程序语句集(如“祖先”示例中):给定非同步操作a,b(由不同线程执行的任何操作,在没有适当同步的情况下),aRbbRa 都不成立。

【讨论】:

    猜你喜欢
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2014-12-06
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多