簡體   English   中英

有時會收到java.util.ConcurrentModificationException,有時則不會。 不知道為什么

[英]Sometimes receiving java.util.ConcurrentModificationException, sometimes not. Can't figure out why

因此,首先是錯誤消息:

線程“ Thread-2”中的異常
java.util.ConcurrentModificationException
在java.util.ArrayList $ Itr.checkForComodification中(未知源)
在java.util.ArrayList $ Itr.next(未知源)
在zom.mainpac.Game.render(Game.java:218)
在zom.mainpac.Game.run(Game.java:154)
在java.lang.Thread.run(未知來源)

在第218行呈現我的ArrayList對象:

    for(Objects e : list){
    e.render(g);
    }

然后我的渲染功能在第154行:

    render();

...

private void render() {

    BufferStrategy bufferStrategy = this.getBufferStrategy();

    if (bufferStrategy == null) {

        this.createBufferStrategy(2);
        return;

    }

這個問題可能是因為我的筆記本電腦不能使所有的對象有時 ,所以放棄了。 所以我只是想知道是否有更好的方法可以做到這一點而不會一直崩潰。

您遇到線程安全問題和/或列表訪問問題。 您可能希望將列表/數組項復制到局部變量中,以便在遍歷和/或考慮同步塊時無法修改列表。

一個線程正在訪問您的實例列表變量(執行for循環),然后另一個線程出現,也許它想訪問它。 若要解決而不是使用實例變量執行for循環,請創建一個局部變量,然后從.list復制這些項目。 現在您有一個私有列表,其他任何線程都無法訪問

發生問題是因為您的代碼在迭代時修改了列表。

  • 如果只有一個線程可以從列表中讀取/寫入列表,則最有可能調用

    this.createBufferStrategy(2);

有時會將某些元素添加到同一數組列表中。 如果將使用列表的副本進行迭代,則可以解決此異常:

for (Objects e : new ArrayList(list)) {
   e.render(g);
}
  • 如果您有多個線程可以讀取/寫入列表,請改用java.util.concurrent.CopyOnWriteArrayList

For Each使用迭代器進行循環,因此,如果您碰巧要從該列表中刪除某些內容,則在迭代過程中很容易遇到此類異常。 例如,如果您在渲染時從游戲列表中刪除了圖塊或精靈,則可能會發生這種情況。 如果您不打算修改列表,那么通常可以使用CopyOnWriteArrayList,如果您希望在迭代時修改列表(那么您不必創建列表的副本),但是請務必注意,首先應該了解導致這並且不要使用盲目修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM