线程安全的Multiset

时间:2014-07-16 01:28:31

标签: java multithreading thread-safety guava multiset

我一直在谷歌搜索一段时间,并且无法相信我找不到它,但我怎样才能安全地实现多线程访问多线程以进行读写。

多集正在将视图存储到某些页面,并且将是一个简单的Multiset<String>

旧版本的Guava在synchronizedMultiset类中有Multisets个函数。我应该只使用自己的同步包装器吗?我更愿意使用库版本。

3 个答案:

答案 0 :(得分:4)

使用ConcurrentHashMultiset

This bug report表示并发集合优先于同步包装器,但这并不能解释Multimaps.synchronizedMultimap存在的原因。

答案 1 :(得分:0)

根据Google Collection Code Multiset只能使用方法执行线程安全

synchronizedMultiset()

此外,必要用户在迭代任何集合视图时手动同步返回的多集合

虽然

在网上没有太多关于此系列的信息

答案 2 :(得分:0)

我认为自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();
}

编写一个简化使用的瘦包装应该很容易。