次のように、1 つのスレッドでループを反復処理しようとしています。
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
. リスト自体はプライベートであり、外部クラスがそれを直接取得する方法はありません (オブジェクトを明示的に追加/削除するメソッドがあります) ため、これが結果に影響を与えるとは思いません。