首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java同步列表

Java同步列表
EN

Stack Overflow用户
提问于 2012-07-06 18:25:16
回答 5查看 118.5K关注 0票数 65

我有一个预先填充的数组列表。并且我有多个线程可以从数组列表中删除元素。每个线程调用下面的remove方法,并从列表中删除一项。下面的代码给了我一致的行为吗?

代码语言:javascript
复制
ArrayList<String> list = Collections.synchronizedList(new ArrayList<String>());

void remove(String item)
{
     do something; (doesn't work on the list)
     list.remove(item);
}

谢谢!

EN

回答 5

Stack Overflow用户

发布于 2012-07-06 18:32:09

只要你不要求"remove“方法是原子的,这应该没问题。

换句话说,如果“做某事”检查项目在列表中出现不止一次,那么当您到达下一行时,该检查的结果可能是错误的。

此外,确保在迭代时在列表上进行同步:

代码语言:javascript
复制
synchronized(list) {
    for (Object o : list) {}
}

正如Peter Lawrey所提到的,CopyOnWriteArrayList可以让您的工作更轻松,并且可以在高度并发的环境中提供更好的性能。

票数 24
EN

Stack Overflow用户

发布于 2012-11-01 04:59:29

列表可能有两个不同的问题:

1)如果您在迭代中进行修改,即使是在单线程环境中,您也将拥有如下示例中的ConcurrentModificationException:

代码语言:javascript
复制
List<String> list = new ArrayList<String>();
for (int i=0;i<5;i++)
   list.add("Hello "+i);

for(String msg:list)
   list.remove(msg);

因此,为了避免这个问题,您可以这样做:

代码语言:javascript
复制
for(int i=list.size()-1;i>=0;i--)
   list.remove(i);

2)第二个问题可能是多线程环境。如上所述,您可以使用同步(列表)来避免异常。

票数 3
EN

Stack Overflow用户

发布于 2012-07-06 18:37:43

它将为添加/删除操作提供一致的行为。但在迭代时,您必须显式同步。Refer this link

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11360401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档