Java 在ConcurrentHashMultiset(guava)中以原子方式获取Multiset项

Java 在ConcurrentHashMultiset(guava)中以原子方式获取Multiset项,java,guava,Java,Guava,我有一个ConcurrentHashMultiset,我想自动检索元素的计数和multiset的总大小。差不多 final double count = set.count(element); final double size = set.size(); 但是作为一种原子操作。有没有办法做到这一点,而不用为集合的所有用法使用读/写互斥锁,或者创建集合的不可变副本?使用toArray获取集合的副本!其他一切都没有意义。即使有可能以原子方式获得大小和计数,也永远无法确保该集合没有被紧接着的另一个

我有一个
ConcurrentHashMultiset
,我想自动检索元素的计数和multiset的总大小。差不多

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

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

使用
toArray
获取集合的副本!其他一切都没有意义。即使有可能以原子方式获得大小和计数,也永远无法确保该集合没有被紧接着的另一个线程修改


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

使用
toArray
获取该集合的副本!其他一切都没有意义。即使有可能以原子方式获得大小和计数,也永远无法确保该集合没有被紧接着的另一个线程修改


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

如果查看
ConcurrentHashMultiset
的实现:

 private final transient ConcurrentMap<E, AtomicInteger> countMap;
private final transient ConcurrentMap countMap;
没有非阻塞方法可以从中获得原子上的两个值。这是两个独立的操作


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

如果您查看
ConcurrentHashMultiset
的实现:

 private final transient ConcurrentMap<E, AtomicInteger> countMap;
private final transient ConcurrentMap countMap;
没有非阻塞方法可以从中获得原子上的两个值。这是两个独立的操作


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

根据?我很好奇这在理论上是如何应用的?:-)大致上,我需要得到集合中某个项目的有效概率。这涉及计算计数/大小(用于简单的最大似然估计)。为了加快速度,我需要并行化采样器(获得概率的思维)和改变多集的线程…嗯,我明白了-一个很好的例子。如果除了
synchronizedMap
解决方案之外还有其他解决方案,这很有趣。根据,似乎size()返回的元素没有任何保证。请描述一下用例好吗?我很好奇这在理论上是如何应用的?:-)大致上,我需要得到集合中某个项目的有效概率。这涉及计算计数/大小(用于简单的最大似然估计)。为了加快速度,我需要并行化采样器(获得概率的思维)和改变多集的线程…嗯,我明白了-一个很好的例子。如果除了
synchronizedMap
解决方案之外还有其他解决方案,那就很有趣了。