簡體   English   中英

線程安全的Multiset

[英]Thread-safe Multiset

我已經谷歌搜索了一段時間,不能相信我找不到它,但我怎樣才能安全地實現一個多線程,多線程可以讀取和寫入。

multiset將視圖存儲到某些頁面,並且將是一個簡單的Multiset<String>

舊版本的Guava在Multisets類中有一個synchronizedMultiset函數。 我應該只使用自己的同步包裝器嗎? 如果可用,我更喜歡使用庫版本。

使用ConcurrentHashMultiset

此錯誤報告表明並發集合優先於同步包裝,但這並不能解釋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.

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