2

我有一个由多个线程访问的 ArrayList。主线程只清除列表,其他人添加到它。我不希望在另一个线程向其中添加项目时清除列表。我希望在线程向其中添加项目时锁定列表。

这是添加线程的代码:

synchronized (items)
{
    int length = jsonArray.length();
    if ((length > 0)) for (int i = 0; i < length; i++)
    {
        items.add(new Item(jsonArray.getJSONObject(i)));
    }
}

但我不使用同步块进行清除。清除也需要同步块吗?

4

2 回答 2

2

处理此问题的一种快速方法是仅使用

List<Foo> items = Collections.synchronizedList(new ArrayList<Foo>());

所有方法都将同步,您将是安全的。

如果有人在此处对性能发表评论,请提供 OP 场景的实际数据以支持您的声明。

于 2013-10-17T20:02:47.150 回答
1

我不希望在另一个线程向其中添加项目时清除列表。

那么是的,你也需要有clear例程synchronized

在下面的示例中,同步语句中的add不会阻塞clear

public void add(T t) {
   synchronized(items) {
      items.add(t);
   }
}

public void clear() {
   items.clear();
}
于 2013-10-17T19:50:42.617 回答