[英]Can we have an AtomicEnum in Java?
今天我看到了AtomicEnum的這個實用程序類,但我想知道是否有可能有一個原子枚舉為什么它不包含在Java標准庫中? 事實上,我非常懷疑它是否真的是原子的,如果這個實用程序類有效。
AtomicEnum類是這樣的
今天我看到了AtomicEnum的這個實用程序類,但我想知道是否有可能有一個原子枚舉為什么它不包含在Java標准庫中?
您鏈接到的AtomicEnum
類只包裝AtomicReference
類,它為任何Object
提供並發訪問。
如果您有多個線程同時獲取並設置它,那么真的是一個volatile enumField
就是您所需要的。 volatile
關鍵字確保其他線程可以看到一個線程所做的更新。 如果需要執行compareAndSet(...)
類型的方法,則需要AtomicReference
- 如果字段是特定值,則進行原子測試,然后才更新它。
我如何檢查它是否以原子方式執行操作?
AtomicReference
是經過充分測試的java.util.concurrent
類的一部分。
是否有一個工具可以查看已編譯的代碼,並確保它只在一個機器指令中完成所有操作?
這不應該是必要的。 如果您想看看它在做什么,您可以查看AtomicReference
源代碼。 不幸的是真正的魔法是在sun.misc.Unsafe
本機代碼。
是否有可能從代碼中發現它?
這不應該是必要的。
因此,如果這個Atomic枚舉工作,我可以有一個屬性AtomicEnum,它可以安全地使用它沒有volatile關鍵字和同步的getter和setter?
是的, AtomicReference
包含一個volatile V value
所以你不必這樣做。
這個AtomicEnum
只是一個圍繞AtomicReference
的薄包裝,這是有道理的,因為enum
值只是一個對象(引用)。
因此, 如果 AtomicReference
正常工作(我認為我們可以假設), AtomicEnum
也可以正常工作。
對引用的訪問是原子的,但對對象的訪問不是。 因此,引用值的更改將在所有線程中正確傳播,但實際枚舉對象中的更改可能不會。
例...
enum Weekdays {
public int rank = 0;
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;
}
情況1:
AtomicEnum<Weekdays> today = Weekdays.TUESDAY;
每個共享'今天'的帖子都會引用Weekdays.TUESDAY
案例2:
today.rank = 3;
無法保證每個線程都具有更新的排名。 (rank不是volatile。每個人都在緩存中維護對象的單獨副本。)
所以引用訪問是原子的,但是對象不是。
注意:
1)原子訪問並不意味着在一台機器指令中執行。 但從邏輯上講,它可以這樣想。 雖然它是不可分割的,但它可以包含幾個指令。
2)即使存在這樣的工具,也很難測試它,因為更新過程幾乎是不可預測的。 因此可能出現誤報結果。
希望這可以幫助。
我認為寫任何這樣的課沒有意義。 事實上,如果你正在寫這樣的課程,你需要重新思考課程的責任。 ENUM絕對是線程安全的,所以我不確定為什么有人需要AtominEnum,或者它只是某些類是Atomic並且還使用了一些枚舉但是然后命名它AtomicEnum非常令人困惑,設計或命名約定不好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.