簡體   English   中英

我們可以在Java中使用AtomicEnum嗎?

[英]Can we have an AtomicEnum in Java?

今天我看到了AtomicEnum的這個實用程序類,但我想知道是否有可能有一個原子枚舉為什么它不包含在Java標准庫中? 事實上,我非常懷疑它是否真的是原子的,如果這個實用程序類有效。

AtomicEnum類是這樣的

  1. 我如何檢查它是否以原子方式執行操作?
  2. 是否有一個工具可以查看已編譯的代碼,並確保它只在一個機器指令中完成所有操作?
  3. 是否有可能從代碼中發現它?
  4. 因此,如果這個Atomic枚舉工作,我可以有一個屬性AtomicEnum,它可以安全地使用它沒有volatile關鍵字和同步的getter和setter?

今天我看到了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.

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