[英]Replace AtomicBoolean by primitive type when only the get() and set() methods are used?
我的代碼包含一些AtomicBoolean
字段。 僅調用這些字段的get()
和set()
方法。
可以安全地將這些字段的類型替換為原始布爾值嗎?
我的意思是,原始布爾值的賦值和訪問操作是Java中的原子操作。 從這個角度來看,我看不出有任何理由使用AtomicBoolean
。
以我的理解,只有使用諸如compareAndSet
類的將比較和訪問結合起來的方法時, AtomicBoolean
才有意義。 我對此有誤嗎? 你能解釋為什么嗎?
在Java Concurrency in Practice中,原子變量被描述為“更好的揮發物” (請參見15.3節)。 這是這本書的摘錄:
原子變量類提供
volatile
變量的一般化,以支持原子條件式的讀取-修改-寫入操作。AtomicInteger
表示一個int
值,並為get
和set
方法提供與讀取和寫入volatile int
相同的內存語義。
應用於您的案例,這意味着如果僅使用AtomicBoolean
get()
和set()
方法,則可以安全地將它們替換為對volatile boolean
的讀寫。
需要volatile
來確保所有線程都能看到該變量的最新值。 返回到Java並發實踐 (第3.1.4節):
當將一個字段聲明為
volatile
時,將通知編譯器和運行時該變量是共享的,並且對該變量的操作不應與其他內存操作重新排序。Volatile
變量不會緩存在寄存器中或對其他處理器隱藏的緩存中,因此對volatile
變量的讀取始終會返回任何線程的最新寫入。
可以安全地將這些字段的類型替換為原始布爾值嗎?
簡單的基本boolean
與AtomicBoolean不同 (后者在多線程環境中提供了原子訪問)。
但是,安全的替代選擇可能是使用volatile boolean
,它也可以提供原子訪問,但是我建議您保持AtomicBoolean
(因為它提供了其他API方法,以防將來使用)。
答案是不。 您可以在此處找到原因, 為什么AtomicBoolean不能代替Boolean?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.