首頁 > Java > java教程 > 主體

Java 中的「發生之前」一致性是什麼?

DDD
發布: 2024-10-31 16:41:30
原創
452 人瀏覽過

What is

理解發生前一致性

Java 語言規範(JLS) 中發生前一致性的概念是指以下內容的一致順序:在多執行緒環境中讀取和寫入。

Happens-Before 一致性的定義

如果對於每個讀取r,一組操作A 是發生前一致的在A 中,其中W(r ) 是r 看到的寫入操作:

  • hb(r, W(r))(r 發生在W(r) 之前)
  • 或A 中不存在寫入w,使得w.v = r.v 且hb(W(r), w) 和hb(w, r) (r 和w 之間沒有不一致)

已回答的問題

1.你的理解正確嗎?
是的,你的理解是正確的。 「它等於以下單字:...,情況是既不...也不...」是正式定義的邏輯等價物。

2. 「w.v = r.v」是什麼意思?
w.v 和 r.v 分別指寫入 w 和讀取 r 存取的變數的值。條件 w.v = r.v 表示兩個操作中讀取的值相同。

3.執行順序中左邊的數字代表什麼?
左邊的數字代表原始程式碼中的操作順序。

4.您對 volatile 欄位的理解正確嗎?
是的,您的理解是正確的。在第一個執行順序中,r2 和 r1 都看到初始寫入 0,因為 A 和 B 是非揮發性字段,允許延遲或不一致的讀取。

5。這種情況(讀後看到寫)在現實世界中存在嗎?
是的,它可以存在。一個例子是,當兩個執行緒透過自己的暫存器存取共享資料時,最佳化會阻止讀取執行緒偵測寫入執行緒所做的變更。

6.你能舉一個真實的例子嗎?
考慮以下示例:

線程1

<code class="java">volatile boolean running = true;</code>
登入後複製

線程2

<code class="java">while (running) {
  // Perform task
}</code>
登入後複製

在這個例子中,如果讀取執行緒的最佳化阻止它載入更新的running 值,它將繼續看到過時的值並無限期地執行循環,即使執行緒1 已經將running 設為錯誤。

以上是Java 中的「發生之前」一致性是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板