我有一個EnumSet
這是最終的和不可變的,即在構造函數中初始化一次。是隻讀的EnumSet迭代器線程安全嗎?
請問EnumSet
線程安全的方法是否安全?它在內部使用迭代器來進行包含檢查。因此,如果兩個線程同時調用,則一個調用中的迭代器位置是否會影響另一個調用?或者這兩個線程調用中的迭代器是否有不同的實例?
我有一個EnumSet
這是最終的和不可變的,即在構造函數中初始化一次。是隻讀的EnumSet迭代器線程安全嗎?
請問EnumSet
線程安全的方法是否安全?它在內部使用迭代器來進行包含檢查。因此,如果兩個線程同時調用,則一個調用中的迭代器位置是否會影響另一個調用?或者這兩個線程調用中的迭代器是否有不同的實例?
不,如果兩個線程同時調用,那將會調用iterator()
兩次,這將創建兩個單獨的迭代器。
如果您試圖在兩個線程之間共享一個迭代器,那麼即不是一個好主意。
請注意,如果你修改的設置在一個線程中,而在另一個(例如,通過contains
)遍歷它,然後將文檔的此位進場:
返回的迭代器是弱一致的:它將永遠不會拋出ConcurrentModificationException,它可能會或可能不會顯示迭代過程中發生的對集合所做的任何修改的影響。
的內容的EnumSet
的可以儘管參考它是最終被改變。沒有EnumSet
是不可變的。但是,您可以通過Collections.unmodifiableSet()
包裝您的EnumSet
。如果您還避免保留對原始EnumSet
的任何引用,那麼不可修改的包裝器對象在功能上是不可變的。
儘管有可變性,但只要Set
未被修改,兩個迭代器在同一時間在同一個Set
上操作就沒有問題。這與僅有一個迭代器的情況沒有任何區別。
在任何情況下,EnumSet
的方法可能不會創建或使用迭代器。該類通過位矢量實現成員資格,所以它使用位操作來執行測試。