我在实践中阅读Java并发性,在"16.1.3 Java内存模型( 500字以下)“中,它说:
Java模型是根据操作指定的,包括对变量的读和写,监视器的锁和解锁,以及线程的启动和连接。 JMM定义了一个名为发生的偏序,在程序内的所有操作之前。为了保证执行操作B的线程能够看到操作A的结果(无论A和B是否发生在不同的线程中),必须有一个发生--在A和B之间的关系没有发生的情况下--在两个操作之间排序之前,JVM可以随意地重新排序它们。
尽管动作只是部分有序,同步操作--锁定获取和释放,以及对易失性变量的读写--都是完全ordered.的,这使得描述发生在“后续”锁获取和读取易失变量方面是明智的。
关于“偏序”,我找到了this和this,但我不太明白“尽管动作只是部分有序的,同步操作--锁定获取和释放,以及易失变量的读写--都是完全有序的。”“同步操作是完全有序的”是什么意思?
发布于 2020-01-25 12:49:03
分析“同步操作完全有序”的语句:
S (Actions)S的关系R:它是发生之前的关系。也就是说,给定程序语句a和b,aRb当且仅当a发生时-在a之前然后声明说,"relation R是S上的总“。
"relation R是完全超过S的“,意思是对于set S (使用a!=b)中的a,b的每两个操作,或者aRb或bRa。也就是说,a发生在b之前,或者b发生在a之前。
如果我们将set S定义为在同一个锁对象X上执行的所有锁获取和锁释放的集合;那么set S是按发生前关系排序的完全:a是由线程T1执行的锁X的获取,b是由线程T2执行的锁获取。然后任何一个a都会发生--在b之前(万一T1首先获得锁)。T1需要先释放锁,然后T2才能获得锁);或者b发生--在a之前(万一T2先获得锁)。
注:并非所有的关系都是合计的。
例如,关系<=是实数的总和。也就是说,对于每一对实数的a,b,a<=b或b<=a都是正确的。这里的总订单意味着,给定任何两个项目,我们总是可以决定哪个是第一个wrt。给定的关系。
但是关系P:“是人类的祖先”,并不是所有人类集合上的全部关系。当然,对于一些人类( a,b )来说,aPb (a是b的祖先)或bPa (b是a的祖先)都是事实。但是对他们中的大多数人来说,aPb和bPa都不是真的;也就是说,我们不能用关系来决定哪一项是“第一”的(用系谱术语来说)。
回到程序语句--在relation R显然是部分之前--在all程序语句集上(如“示例的祖先”中):给定不同步操作a,b (在没有适当同步的情况下,由不同线程执行的任何操作),aRb和bRa都不起作用。
https://stackoverflow.com/questions/59896563
复制相似问题