2017-06-15 20 views
3

在JLS 17.4.4,它說如何理解總訂單的同步訂單?

每次執行具有同步順序。同步順序是執行的所有同步操作的總順序。

我知道什麼是總訂單。而且我知道同步操作需要訂購。但是,這裏讓我困惑的是爲什麼它是ALL的同步操作的總訂單。例如,在監視器m上的解鎖動作發生在m的所有後續鎖定動作之前。但是,如果同時顯示器上有鎖定動作n,是否需要在顯示器上的解鎖動作後訂購m?如果不是,那麼爲什麼所有的同步操作都有一個總的順序?謝謝。

回答

1

偉大的問題。雖然我不知道答案是肯定的,但我認爲最符合我理解的解釋是,在兩個不同的鎖之間存在「同步順序」,因爲JLS 17.4.2將描述爲按「同步順序」排序的操作定義爲必須是線程間的(並且因此一個線程必須在另一個線程接收它之前調度該動作)。

然而,這裏的漁獲:

同步操作誘導同步,與行動關係,定義如下[...]

只有通過行動synchronized-有序與產生所需/期望的記憶效應(即提前緩存狀態)。

所以基本上,雖然所有的「同步行動」遵循「同步命令,」(因此「總序),但只有那些同步,與模式是有效的線程安全。

+0

首先,我真的很感謝你的迴應,我認爲你的觀點已經啓發了我,我正在考慮的是:從17.4.3「如果所有動作都是以全部順序(執行順序)發生,這與程序的順序是一致的「,而且JMM語義上是順序一致的,這是通過同步動作來同步競爭數據來保證的,所以同步動作總有一個順序來確保JMM的順序一致性。訂購這裏是關於同步操作的可見性。 –

+0

總結一下。雖然理論上認爲JMM的工作方式很有用,但實際上我真的不能想到這樣一個細節會有用的地方;線程間行爲以這種方式表現的事實可能不是JMM的副作用,但更可能是現今大多數CPU緩存工作的方式(如果我錯了,請糾正我)。無論哪種方式,如果您覺得這些細節對您的職業或項目或者其他方面有用,我會很好奇你分享:) – xTrollxDudex