我一直在谷歌搜索一段时间,并且无法相信我找不到它,但我怎样才能安全地实现多线程访问多线程以进行读写。
多集正在将视图存储到某些页面,并且将是一个简单的Multiset<String>
。
旧版本的Guava在synchronizedMultiset
类中有Multisets
个函数。我应该只使用自己的同步包装器吗?我更愿意使用库版本。
答案 0 :(得分:4)
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();
}
编写一个简化使用的瘦包装应该很容易。