列表大小与设置大小不匹配

时间:2018-04-26 12:10:20

标签: java

创建大型列表时遇到了奇怪的事情。我创建了子列表,因为整个列表太大了。但在检查结果尺寸时,我发现:

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);
}

我必须做一些代码不同意的事情......但是什么?

1 个答案:

答案 0 :(得分:2)

  

由不同的线程填充

我认为这是你的问题。 HashSet不是线程安全的。当同时从多个线程写入时,任何事情都可能发生。

使其同步(来自docs):

 Set s = Collections.synchronizedSet(new HashSet(...));

您的addSynchronized方法具有误导性名称,因为它不是synchronized。 (名为list的参数实际上是Set也有点令人困惑。)