我有ConcurrentHashMultiset
,我想原子地检索元素的数量和多集的总大小。像
final double count = set.count(element);
final double size = set.size();
但作为原子操作。如果没有对集合的所有用法使用读/写互斥量或创建集合的不可变副本,有没有办法做到这一点?
答案 0 :(得分:3)
使用toArray
获取它的副本!其他一切都毫无意义。即使可以原子地获得大小和计数,你也永远不能确定该集合在此之后不会被另一个线程修改。
除此之外:尺寸不保证返回精确值!如果在调用size
时另一个线程修改了该集合,则未定义天气或不这些修改会影响大小计算。
答案 1 :(得分:3)
如果您查看ConcurrentHashMultiset
的实现:
private final transient ConcurrentMap<E, AtomicInteger> countMap;
没有非阻塞方法从原型上获取两个值。这是两个独立的操作。
toArray()
对于此操作是非原子的,因为它非阻塞地依赖于迭代AtomicInteger
的列表,这些列表可能会及时更改。