创建大型列表时遇到了奇怪的事情。我创建了子列表,因为整个列表太大了。但在检查结果尺寸时,我发现:
new ArrayList<>(rSet).size() != rSet.size();
其中rSet是HashSet
当我停止eclipse并进行调查时,我发现rSet有1000个项目,同时响应.size()为少(less
项的数量波动;有时rSet.size()
高于它实际包含的值)。我无法在单独的测试用例中重现这一点;代码有太多层要提供。但是由单独的线程填充,这些线程在调用size
时结束。
我说我是从线程中填充的。我将Set<> rSet
作为参数提供给所有线程,并使用以下方法将新项添加到集合中:
public static void addSynchronized(final Set<?> c, final List<?> items) {
c.addAll(items);
}
我必须做一些代码不同意的事情......但是什么?
答案 0 :(得分:2)
由不同的线程填充
我认为这是你的问题。 HashSet
不是线程安全的。当同时从多个线程写入时,任何事情都可能发生。
使其同步(来自docs):
Set s = Collections.synchronizedSet(new HashSet(...));
您的addSynchronized
方法具有误导性名称,因为它不是synchronized
。 (名为list
的参数实际上是Set
也有点令人困惑。)