【发布时间】:2012-08-23 12:46:41
【问题描述】:
我正在寻找一个特定的数据结构,它与 ConcurrentSkipListSet 完全一样,但没有线性 size-操作,对于较大的集合可能会经常调用它。
我知道Collections.synchronizedNavigableSet(new TreeSet()),但是同步迭代:
synchronized (set) {
Iterator<T> iter = set.iterator();
while (iter.hasNext())
iter.next();
}
很慢。
那么,您知道NavigableSet 实现与ConcurrentSkipListSet 完全相同,但没有线性size 操作,例如在Apache Commons、Guava 中?或者我应该对集合进行不同的迭代?
【问题讨论】:
-
您也可以自己继承
ConcurrentSkipListSet并插入一小段代码来缓存和跟踪集合的大小。 -
我已经想到了,也许我试试看,谢谢。我只是认为其他一些库可能会提供一个实现。
-
再想一想,考虑到良好的并发性所施加的所有约束,实现它可能不值得。他们首先这样做是有充分理由的。
-
你能减少多少你需要知道 size() 所以没关系?顺便说一句,当您调用此方法时,大小可能会发生变化,因此您只能知道大小,而不是大小。
-
是的,大小不必那么准确(不需要阻塞整个数据结构),并且应该只反映调用时的“最佳猜测”。所以我开始使用一个保持当前大小的
volatile实例变量来覆盖它,并让它在add返回时增加true并减少删除类似。现在我尝试评估我所做的 - 如果它是明智的。
标签: java multithreading data-structures collections thread-safety