我在實踐中研究JAVA并發,發現原子操作的定義如下:
如果從執行 A 的執行緒的角度來看,操作 A、B 相互之間是原子的,當另一個執行緒執行 B 時,B 要么全部執行,要么一個都不執行。原子操作是相對于所有操作(包括其自身)對相同資料進行操作的原子操作。
假設我有兩個執行緒 A 和 B 都訪問 AtomicLong 變數計數。
假設執行緒 A 讀取計數,執行緒 B 正忙于執行 count.incrementAndGe() 操作。
在這種情況下,根據上述定義(所有 B 已執行或均未執行):
A) ThreadA 看到之前的 count 值(因為 count 還沒有更新)
要么
B) ThreadA 會等到 ThreadB 完成操作并查看最新值。
根據我的理解,它應該是 B,否則我們仍然可能有競爭條件。
uj5u.com熱心網友回復:
您所描述的情況稱為“資料競賽”。執行緒 A 將贏得比賽(它看到初始值),或者執行緒 B 將贏得比賽(執行緒 A 看到最終值。)除非您提供了一些明確的方法來強制執行緒以特定順序訪問變數,那么就沒有辦法知道誰會贏得比賽。
“原子性”意味著執行緒 B 將看到原子操作之前的資料,或者將在操作完成后看到它。執行緒 B 永遠看不到它處于中途完成的狀態。
用于更新單個 64 位long值。幾乎唯一可能“半途而廢”的方法是 64 位值在 32 位硬體上被撕裂。如果組成 64 位值的兩個 32 位字中的一個已更新,而另一個沒有更新,則它將被“撕裂”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/447421.html
