繁体   English   中英

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

[英]Atomically get Multiset entry in ConcurrentHashMultiset (guava)

我有一个ConcurrentHashMultiset ,我想以原子方式检索元素的数量和多集的总大小。 就像是

final double count = set.count(element);
final double size = set.size();

但作为原子操作。 有什么方法可以在不使用读/写互斥锁的情况下使用该集合的所有用法或创建该集合的不可变副本吗?

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

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

如果您研究ConcurrentHashMultiset的实现:

 private final transient ConcurrentMap<E, AtomicInteger> countMap;

没有非阻塞方法可以从中自动获取两个值。 这是两个单独的操作。

toArray()对于此操作而言是非原子的,因为它无阻塞地依赖于对AtomicInteger列表的迭代,该列表可能会随时间变化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM