[英]can java atomic integer be implemented without declaring value volatile?
對我來說,僅憑CAS
就能確保原子整數的原子性。 那么,為什么要麻煩聲明基礎value
volatile
呢?
我知道volatile
阻止編譯器和硬件重新排序,並確保指令順序。 但這在這里有用嗎?
這是什么問題 沒有volatile
什么問題?
假設它是java.util.concurrent.atomic
包中的Atomic*
類。
您正在談論兩個不同的概念:對原子對象的引用和原子對象本身。
的確,在同一原子整數對象上的CAS
是原子的。 但是,如何確定兩個線程中的compareAndSet
方法調用應用於同一對象? 就像任何由多個線程共享的java對象一樣, 這與[atomic]對象的安全發布有關 。
在這里volatile
, final member variables
或鎖定很有用。 對對象的引用應由多個線程正確共享。
重讀問題后,我看到您可能會問為什么AtomicInteger
的value
成員被聲明為volatile
。 對於初學者來說,並非所有方法都基於unsafe.compareAndSwapInt
,有簡單的set
和get
可以直接訪問value
字段,這足以使此字段volatile
。 我想知道unsafe
操作是否也需要它。
引用Oracle文檔 :
對於聲明為volatile的所有變量(包括long和double變量),讀寫都是原子的。
...但是,由於內存一致性錯誤仍然可能發生,因此並不能消除所有同步原子操作的需要。 使用易失性變量可降低內存一致性錯誤的風險,因為對易失性變量的任何寫操作都會與該變量的后續讀取建立先發生后關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.