理解發生前一致性
Java 語言規格 (JLS) 第 17 章介紹了發生前一致性的概念。簡單地說,如果 A 中沒有讀取操作看到其後發生的寫入操作,或者 A 中存在另一個與讀取操作衝突的寫入操作,則一組操作 A 是發生前一致的。
理解定義
發生在一致性之前的定義可以解釋如下:(a)讀取操作不可能看到在其之後發生的寫入操作,或(b) 在同一線程中存在另一個寫入操作,該寫入操作與讀取操作寫入同一變量,並且寫入操作發生在讀取操作之前。
發生在一致性的範例如下所示您提供的第二個執行順序:
r2 = A; // sees write of A = 2 r1 = B; // sees write of B = 1 B = 1; A = 2;
在這種情況下,r2 看到先前執行的對A 的寫入,r1 看到對B 的寫入。因此,此執行順序是發生之前一致的。
對實際應用程式的影響
在多執行緒環境中,發生前一致性可確保執行緒以正確的順序看到其他執行緒執行的寫入。然而,在某些情況下,讀取會看到稍後發生的寫入,稱為重新排序。這種情況可能是由於記憶體最佳化或硬體快取而發生的,它們可以暫時將資料儲存在私有暫存器中。
重新排序的一個範例是當執行緒已寫入變數但新值對其他執行緒不可見時,因為它仍然儲存在私人暫存器中。如果受影響的變數在執行緒之間共享,這可能會導致意外的行為和競爭條件。
為了防止重新排序,可以使用揮發性欄位。易失性欄位確保讀取和寫入以一致的順序執行,並且所有執行緒看到相同的值。這是透過強制讀寫存取共享記憶體而不是私有暫存器來實現的。
以上是Happens-Before 一致性如何確保多執行緒環境中的順序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!