标签: concurrentmodification

如何在没有ConcurrentModificationException的情况下对Collection <T>进行交互并修改其项目?

我需要做这样的事......

Collection<T> myCollection; ///assume it is initialized and filled


for(Iterator<?> index = myCollection.iterator(); index.hasNext();)
{
    Object item = index.next();
    myCollection.remove(item);
}
Run Code Online (Sandbox Code Playgroud)

显然这会引发ConcurrentModificationException ...

所以我尝试了这个但是看起来并不优雅/高效并且抛出了Type安全:从Object到T的未经检查的强制转换警告

Object[] list = myCollection.toArray();
for(int index = list.length - 1; index >= 0; index--) {
 myCollection.remove((T)list[index]);
}
Run Code Online (Sandbox Code Playgroud)

java collections iterator concurrentmodification

0
推荐指数
1
解决办法
500
查看次数

java.util.AbstractList$Itr.checkForCommodification 三重事件

我运行一个服务器,它有一个处理计时系统的事件处理程序当我连续运行其中 3 个时,它给出了这个异常

Exception in thread "Thread-8" java.util.ConcurrentModificationException
        at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
        at java.util.AbstractList$Itr.next(AbstractList.java:343)
        at EventManager.run(EventManager.java:77)
        at java.lang.Thread.run(Thread.java:662)
Run Code Online (Sandbox Code Playgroud)

这是问题的来源方法:

EventManager.getSingleton().addEvent( new Event() { 
                public void execute(EventContainer c) {
                    p.createProjectile(p.absY, p.absX, offsetY, offsetX, 1166, 43, 31, 70, p2.playerId);
                    c.stop(); // stops the event from running
                }
            }, 950); // in ms (1 second = 1000 ms)
EventManager.getSingleton().addEvent( new Event() { 
                public void execute(EventContainer c) {
                    p2.applyDAMAGE(misc.random(25));
                    c.stop(); // stops the event from running
                }
            }, 1300); // in ms (1 second = 1000 …
Run Code Online (Sandbox Code Playgroud)

java exception concurrentmodification

0
推荐指数
1
解决办法
1万
查看次数

当程序中的所有方法同步时,我是否可能得到ConcurrentModificationException?

我得到了一个ConcurrentModificationException,尽管我使整个程序的所有方法都同步(包括静态方法和main方法).

我没有隐藏的迭代器.

  1. 这怎么可能呢?!
  2. 这是什么意思?
  3. 我该如何解决?

java concurrency concurrentmodification

0
推荐指数
1
解决办法
254
查看次数

ConcurrentModificationExecption

我有一个正常的数据库调用,从我的数据库收集信息.我使用这些信息来创建我的对象(CallQueue)然后将这些对象添加到列表中,然后返回列表.

突然间我发现我原来的代码没有按预期工作,因为我创建了dublicates,所以现在我试图取消任何dublicates被创建!但有个问题!

我无法遍历我的列表并检查是否已创建对象!

这是我的代码:

while (query.next()) {
    if (!queues.isEmpty()) {
        /*This gives the Execption->*/
        for (CallQueue callQueue : queues) {
            if (callQueue.getType().equals(query.getString("KØ"))) {
                double decimalTime = query.getDouble("TID");
                int hourOfDay = (int)Math.round(24 * decimalTime);
                int callAmount = query.getInteger("ANTAL_KALD");
                if (hourOfDay > 19) {
                    hourOfDay = 19;
                }
                callQueue.addCallsByTime(hourOfDay, callAmount);
            } else {
                String queueName = query.getString("Kø");
                if (!queueName.equalsIgnoreCase("PrivatOverflow")) {
                    CallQueue cq = new CallQueue(query.getString("KØ"));
                    double decimalTime = query.getDouble("TID");
                    int hourOfDay = (int)Math.round(24 * decimalTime); 
                    int callAmount = query.getInteger("ANTAL_KALD");
                    if …
Run Code Online (Sandbox Code Playgroud)

java loops concurrentmodification

0
推荐指数
1
解决办法
89
查看次数

为什么原始变量会在新变量发生变化时发生变化?

我有以下代码块:

ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<Integer> list2 = list1;
// both list1 and list2 are empty arraylists
System.out.println(list1.size()); // prints: 0
list2.add(7);
System.out.println(list1.size()); // prints: 1
Run Code Online (Sandbox Code Playgroud)

为什么我修改list2时,list1也被修改了?这导致ConcurrentModificationException了我的程序.如何在不更改list1的情况下编辑list2?

java iteration arraylist concurrentmodification

0
推荐指数
1
解决办法
44
查看次数

使用LinkedList进行碰撞检测时Java游戏崩溃

我正在制作一个基于太空入侵者的2D java游戏.在我的Game类中,我有以下3个字段:

//enemies left to kill
private LinkedList<Enemy> enemiesLeft = new LinkedList<Enemy>(); 
//enemies killed
private LinkedList<Enemy> enemiesKilled = new LinkedList<Enemy>();
//missiles that have been fired
private LinkedList<Missile> missiles = new LinkedList<Missile>();
Run Code Online (Sandbox Code Playgroud)

在我的checkCollision()方法,我通过每个运行EnemyenemiesLeft列表,并检查每次碰撞Missilemissiles列表,但它抛出一个ConcurrentModificationException.

这是checkCollision()方法:

private void checkCollisions(){
  //make an iterator over enemies
  ListIterator<Enemy> iterEnemies = enemiesLeft.listIterator();   

  //loop through enemies
  while(iterEnemies.hasNext()){
    //error is thrown at below line
    Enemy e = iterEnemies.next();  //current Enemy

    //go through each Missile
    ListIterator<Missile> …
Run Code Online (Sandbox Code Playgroud)

java multithreading linked-list concurrentmodification

0
推荐指数
1
解决办法
186
查看次数

每个android都有ConcurrentModificationException

我是路过ArraylistParseObject,然后我把一个一个foreach循环,提取符合条件的项目时,用户对象不等于空.我面临两个问题.1.如果我通过将不同的数据传递到另一个列表然后在我的适配器中传递该列表来执行以下代码行,我将获得带有数字的随机数据,例如:如果在项目#1上,名称是"MAC",那么它在第3项中显示.

ArrayList<ParseObject> checkRequestedNetArrayList = new ArrayList<ParseObject>();
requestedNetArrayList = (ArrayList<ParseObject>) objects;
MyResponsibilitesActivity.requestedNetArrayList = requestedNetArrayList;
adapterRequest = new GenericAdapter<ParseObject>(
    getApplicationContext(),
    requestedNetArrayList,
    R.layout.requested_trust_net_list_item,
    requestedDataBinder);

requestListView.setAdapter(adapterRequest);

requestedNetArrayList = (ArrayList<ParseObject>) objects;

for(ParseObject object: objects){
    System.out.println(object);
    object.getParseObject("user");
    if(object.has("user")){

        checkRequestedNetArrayList.add(object);

    }else{
        checkRequestedNetArrayList.remove(object);
    }

}

adapterRequest = new GenericAdapter<ParseObject>(
    getApplicationContext(),
    checkRequestedNetArrayList,
    R.layout.requested_trust_net_list_item,
requestedDataBinder);

requestListView.setAdapter(adapterRequest);
Run Code Online (Sandbox Code Playgroud)
  1. 如果我正在执行以下代码行直接给出相同列表中的项目,我得到了 java.util.ConcurrentModificationException

    for(ParseObject object: objects){
    
        if(object.has("user")){
    
            requestedNetArrayList.add(object);
    
        }
    }
    else{
        requestedNetArrayList.remove(object);
    }
    
    adapterRequest = new GenericAdapter<ParseObject>(
        getApplicationContext(),
        requestedNetArrayList,
        R.layout.requested_trust_net_list_item,
        requestedDataBinder);
    
    requestListView.setAdapter(adapterRequest);
    
    Run Code Online (Sandbox Code Playgroud)

    }

请帮帮我.

java android list concurrentmodification

0
推荐指数
1
解决办法
714
查看次数

即使在使用迭代器之后也会获得并发修改异常

请考虑以下代码:

 if(!unmatchedNewTruckRequirementSet.isEmpty()){
        for(Iterator<TruckRequirement> iterator = unmatchedNewTruckRequirementSet.iterator(); iterator.hasNext();){
            TruckRequirement newTruckRequirement = iterator.next();
            for(Iterator<TruckRequirement> iterator1 = oldTruckRequirementSet.iterator(); iterator1.hasNext();){
                TruckRequirement oldTruckRequirement1 = iterator1.next();
                if(oldTruckRequirement1.getTruckClassName().equals(newTruckRequirement.getTruckClassName())) {
                    LogUtil.logInfo("Truck Requirement Changed ", "Truck Requirement Changed : From : {0} to {1} where Truck Class is: {2}",
                            new Object[]{oldTruckRequirement1.getNumberOfTrucks(), newTruckRequirement.getNumberOfTrucks(), newTruckRequirement.getTruckClassName()});
                    unmatchedNewTruckRequirementSet.remove(newTruckRequirement);
                }
            }LogUtil.logInfo("Truck Requirement Added ", "New Truck Requirement Added with Truck Class : {0} and number of Trucks : {1}",
                    new Object[]{newTruckRequirement.getTruckClassName(), newTruckRequirement.getNumberOfTrucks()});

    }else {
        if(oldTruckRequirementSet.size() > unmatchedNewTruckRequirementSet.size()){
            for(TruckRequirement truckRequirement : oldTruckRequirementSet) {
                LogUtil.logInfo("Truck Requirement …
Run Code Online (Sandbox Code Playgroud)

java concurrentmodification

0
推荐指数
1
解决办法
52
查看次数

通过集合进行迭代期间发生ConcurrentModificationException

我正在spring-batch应用程序的ItemProcessor中遍历一个列表,但出现此错误:

java.util.ConcurrentModificationException: null
Run Code Online (Sandbox Code Playgroud)

当我将批处理配置设置为使用单个线程时,它可以正常工作。我正在使用SimpleAsyncTaskExecutor。客户是一个实体,并且具有客户别名列表。

private void fillCustomer(final Customer customer, final ExtractLine result){

CustomerAlias customerAlias = customer.getCustomerAlias().stream().filter(s -> s.getAliasType().isAster()).findFirst().orElse(nullAlias);
result.setCustomer(customerAlias.getCalNmeAliasName());
}


java.util.ConcurrentModificationException: null
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at org.hibernate.collection.internal.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:815)
at java.util.Spliterators$IteratorSpliterator.tryAdvance(Spliterators.java:1812)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
at com.liq.sub.impl.MyProcessor.fillCustomer(MyProcessor.java:107)
Run Code Online (Sandbox Code Playgroud)

java stream spring-batch concurrentmodification

0
推荐指数
1
解决办法
71
查看次数

Java - ConcurrentModificationException

几乎每次调用时,下面的代码都会引发ConcurrentModificationException.第二段代码不会抛出异常,但它不是我需要的正确逻辑.如果对象是一个实例EditorFrame,我需要调用一个自定义处理策略,这就是close()方法.但是,如果它只是一个我希望它调用的基本帧dispose().

我环顾了这个网站并遵循了一些指示,但我找不到任何指示.

抛出异常的代码:

synchronized (frameList) {
    for (Iterator<JFrame> it = frameList.iterator(); it.hasNext();) {
        JFrame frame = it.next();
        if (frame instanceof EditorFrame) ((EditorFrame) frame).close();
        else frame.dispose();
        it.remove();
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码有效,但这不是我想要的:

synchronized (frameList) {
    for (Iterator<JFrame> it = frameList.iterator(); it.hasNext();) {
        JFrame frame = it.next();
        frame.dispose();
        it.remove();
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

java concurrentmodification

-1
推荐指数
1
解决办法
642
查看次数

Java中的迭代器如何知道何时抛出ConcurrentModification异常

我有以下代码抛出ConcurrentModificationException,因为我在同一个列表中使用两个不同的迭代器,其中一个正在修改列表.因此,第二个迭代器在读取列表时抛出异常,因为其他迭代器已经修改了列表.

    List<Integer> list = new ArrayList<>();

    populate(list);//A method that adds integers to list

    ListIterator<Integer> iterator1 = list.listIterator();
    ListIterator<Integer> iterator2 = list.listIterator();

    while (iterator1.hasNext()) {
        if(iterator1.next() < 5)
            iterator1.remove();
    }

    while (iterator2.hasNext()){
        if(iterator2.next() < 5) {
         //Call handler   
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果它还没有到达一个尚未被删除的元素,那么内部如何iterator2知道has已被其他迭代器修改过?怎么弄清楚其他一些人已经改变了?一种方法可能是跟踪大小,但这不是原因,因为其他迭代器可以只替换任何元素.listiterator1iteratorlist

java collections exception concurrentmodification listiterator

-1
推荐指数
1
解决办法
369
查看次数

modCount 是原子变量吗?

我读到,ConcurrentModificationException只要一个线程对某个列表执行结构修改,而另一个线程正在迭代其元素,则可以抛出 a 。为了检测此类修改,类的实例将List它们被修改的次数存储在名为 的字段中modCount,在列表的每次迭代时检查该字段的值以检查后者是否被修改。如果我的理解是正确的,则需要同步访问,因为如果在检查最后一次迭代中的值之后和循环结束之前modCount要修改所涉及的列表,则迭代器将无法检测到该列表是modCount在最后一次迭代期间进行了修改。

java concurrency list concurrentmodification

-1
推荐指数
1
解决办法
92
查看次数

基于索引的迭代期间没有 ConcurrentModificationException

我有以下代码:

public static void main(String[] args) {
 
    List<String> input = new ArrayList<>();
    List<String> output = new ArrayList<>();
    for(int i=0; i< 1000 ;i++){
        input.add(i+"");
    }
    
    
    for(int i=0 ; i<input.size(); i++){
        String value = input.get(i);
        if(Integer.parseInt(value) % 2 == 0){
            output.add(value);
            input.remove(value);
        }
    }
    
    input.stream().forEach(System.out::println);
    System.out.println("--------------------------------------");
    output.stream().forEach(System.out::println);

}
Run Code Online (Sandbox Code Playgroud)

我预计它会抛出,ConcurrentModificationException但它工作正常。有人可以解释一下原因吗?

java iteration loops concurrentmodification

-2
推荐指数
1
解决办法
91
查看次数