我想通過一個循環來遍歷一個線程,就像這樣:同步在每個循環仍然拋出ConcurrentModificationExceptions
for (UnitTask task : chain) {
g.drawLine((int) task.getLocation().getX(), (int) task.getLocation().getY(), (int) currentPos.getX(), (int) currentPos.getY());
g.fillOval((int) task.getLocation().getX() - 2, (int) task.getLocation().getY() - 2, 5, 5);
currentPos = task.getLocation();
}
不過,我還有一個線程(Swing事件線程),可在其中加到這個對象。因此,ConcurrentModificationException
。我試圖通過圍繞代碼synchronized (chain) { ... }
獲得鎖,但我仍然得到錯誤。
帶有一點Java同步新手,我爲何有點困惑。我希望這可以使循環線程安全,但顯然它不是。
有趣的是,chain
是一個自定義類的實例,但它只是一個圍繞LinkedList
的薄包裝。列表本身是私有的,外部類無法直接檢索它(有些方法可以顯式添加/刪除對象),所以我不希望這會影響結果。
因此,對於以'for(UnitTask task:...')開頭的代碼行,即使整個for循環被封裝在'synchronized(chain){...}'中,也會引發ConcurrentModificationException? –
@ RayToal是的,這是正確的。 –
您是否在其他線程中同步列表? –