簡體   English   中英

僅使用get()和set()方法時,用原始類型替換AtomicBoolean?

[英]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值,並為getset方法提供與讀取和寫入volatile int相同的內存語義。

應用於您的案例,這意味着如果僅使用AtomicBoolean get()set()方法,則可以安全地將它們替換為對volatile boolean的讀寫。

需要volatile來確保所有線程都能看到該變量的最新值。 返回到Java並發實踐 (第3.1.4節):

當將一個字段聲明為volatile時,將通知編譯器和運行時該變量是共享的,並且對該變量的操作不應與其他內存操作重新排序。 Volatile變量不會緩存在寄存器中或對其他處理器隱藏的緩存中,因此對volatile變量的讀取始終會返回任何線程的最新寫入。

可以安全地將這些字段的類型替換為原始布爾值嗎?

簡單的基本booleanAtomicBoolean不同 (后者在多線程環境中提供了原子訪問)。

但是,安全的替代選擇可能是使用volatile boolean ,它也可以提供原子訪問,但是我建議您保持AtomicBoolean (因為它提供了其他API方法,以防將來使用)。

答案是不。 您可以在此處找到原因, 為什么AtomicBoolean不能代替Boolean?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM