0

那是我的代码的一部分:

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

4 回答 4

2

当你需要删除一个元素时,你应该使用it.remove() 。

于 2012-10-23T12:23:32.253 回答
0

-必须 synchronize remove()使用方法,否则任何其他线程都可以访问列表并尝试从中删除元素,而其他线程正在将元素放入其中..

 public  synchronized void removeInteger(Integer i)
{
    _list.remove(i);
}
于 2012-10-23T12:23:42.250 回答
0
  • 如果您想在基于条件进行迭代时删除,请在 while 循环中写入条件,您可以使用迭代器的 it.remove() 删除对象,如下所示

            Iterator<Integer> it=_list.iterator(); 
            while(it.hasNext()) 
            {
                Integer i = it.next();
                if(i<10){
                  it.remove();
                }
            }
    
于 2012-10-23T12:48:44.773 回答
0

你可以试试下面的东西(你的条件可以根据你的要求做得更好)

public void removeInteger(Integer i)
{
    Iterator iter = _list.iterator();
    int count=0;
    while(iter.hasNext()){
         if(count==i){
             _list.remove(i);
             break;
         }
    }
}
于 2012-10-23T14:12:14.163 回答