从线程使用的列表中删除时出现异常

时间:2012-10-23 12:18:43

标签: java multithreading concurrentmodification

这是我代码的一部分:

public List<Integer> _list = new ArrayList<>();

public void removeInteger(Integer i)
{
    _list.remove(i);
}

public class CheckThread implements Runnable
{
    @Override
    public void run()
    {
        synchronized(_list) 
        {
            Iterator<Integer> it=_list.iterator(); 
            while(it.hasNext()) 
            {
                Integer i = it.next();
            }
        }
    }
}

线程一直在运行(没有编写那部分),当我使用removeInteger方法从列表中删除时,我得到了ConcurrentModificationException。知道如何解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

当您需要删除元素时,应使用it.remove()

答案 1 :(得分:0)

- 必须 synchronize remove()方法,否则任何其他任何其他线程都可以访问该列表并尝试删除元素来自它,而其他人正在把元素放进去......

 public  synchronized void removeInteger(Integer i)
{
    _list.remove(i);
}

答案 2 :(得分:0)

  • 如果你想在基于条件的迭代中删除而在while循环中写入你的条件,你可以使用iterator的it.remove()删除对象,如下所示

            Iterator<Integer> it=_list.iterator(); 
            while(it.hasNext()) 
            {
                Integer i = it.next();
                if(i<10){
                  it.remove();
                }
            }
    

答案 3 :(得分:0)

您可以尝试下面的某些事情(根据您的要求,您的条件可以更好)

public void removeInteger(Integer i)
{
    Iterator iter = _list.iterator();
    int count=0;
    while(iter.hasNext()){
         if(count==i){
             _list.remove(i);
             break;
         }
    }
}