[英]Thread-safe Multiset
我已經谷歌搜索了一段時間,不能相信我找不到它,但我怎樣才能安全地實現一個多線程,多線程可以讀取和寫入。
multiset將視圖存儲到某些頁面,並且將是一個簡單的Multiset<String>
。
舊版本的Guava在Multisets
類中有一個synchronizedMultiset
函數。 我應該只使用自己的同步包裝器嗎? 如果可用,我更喜歡使用庫版本。
此錯誤報告表明並發集合優先於同步包裝,但這並不能解釋Multimaps.synchronizedMultimap
存在的原因。
根據Google收集代碼, Multiset只能使用該方法執行線程安全
synchronizedMultiset()
此外,當迭代任何其集合視圖時,用戶必須手動同步返回的多集
雖然在網上沒有太多關於這個集合的信息
我想從Java 8中,您可以輕松地更換番石榴Multiset
通過java.util.Map
使用新的方法computeIfAbsent
。
// Create new thread-safe 'multi set' using `java.util.Map`:
Map<String, AtomicInteger> multiSet = new ConcurrentHashMap<>();
// adding elements using computeIfAbsent:
multiSet.computeIfAbsent("a", k -> new AtomicInteger()).incrementAndGet();
multiSet.computeIfAbsent("a", k -> new AtomicInteger()).incrementAndGet();
multiSet.computeIfAbsent("b", k -> new AtomicInteger()).incrementAndGet();
// counting occurences:
System.out.println(multiSet.get("a")); // prints '2'
System.out.println(multiSet.get("b")); // prints '1'
一般來說:
public static <T> int add(Map<? super T, AtomicInteger> multiSet, T element) {
return multiSet.computeIfAbsent(element, e -> new AtomicInteger()).incrementAndGet();
}
編寫一個簡化使用的瘦包裝應該很容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.