簡體   English   中英

在ConcurrentHashMultiset(guava)中以原子方式獲取Multiset條目

[英]Atomically get Multiset entry in ConcurrentHashMultiset (guava)

我有一個ConcurrentHashMultiset ,我想以原子方式檢索元素的數量和多集的總大小。 就像是

final double count = set.count(element);
final double size = set.size();

但作為原子操作。 有什么方法可以在不使用讀/寫互斥鎖的情況下使用該集合的所有用法或創建該集合的不可變副本嗎?

使用toArray獲得它的副本! 其他一切都沒有意義。 即使有可能原子地獲得大小和計數,您也永遠無法確保在此之后該集不會被另一個線程修改。

除此之外:不能保證返回正確的值! 如果在調用size另一個線程修改了該集合,則它是未定義的天氣,或者這些修改不會影響大小計算。

如果您研究ConcurrentHashMultiset的實現:

 private final transient ConcurrentMap<E, AtomicInteger> countMap;

沒有非阻塞方法可以從中自動獲取兩個值。 這是兩個單獨的操作。

toArray()對於此操作而言是非原子的,因為它無阻塞地依賴於對AtomicInteger列表的迭代,該列表可能會隨時間變化。

暫無
暫無

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

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