在ConcurrentHashMultiset(guava)中以原子方式获取Multiset条目

时间:2013-11-24 20:48:10

标签: java guava

我有ConcurrentHashMultiset,我想原子地检索元素的数量和多集的总大小。像

这样的东西
final double count = set.count(element);
final double size = set.size();

但作为原子操作。如果没有对集合的所有用法使用读/写互斥量或创建集合的不可变副本,有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

使用toArray获取它的副本!其他一切都毫无意义。即使可以原子地获得大小和计数,你也永远不能确定该集合在此之后不会被另一个线程修改。

除此之外:尺寸不保证返回精确值!如果在调用size时另一个线程修改了该集合,则未定义天气或不这些修改会影响大小计算。

答案 1 :(得分:3)

如果您查看ConcurrentHashMultiset的实现:

 private final transient ConcurrentMap<E, AtomicInteger> countMap;

没有非阻塞方法从原型上获取两个值。这是两个独立的操作。

toArray()对于此操作是非原子的,因为它非阻塞地依赖于迭代AtomicInteger的列表,这些列表可能会及时更改。