|
ブログエントリーからはじまってコメント、トラックバックなど、PebbleではArrayListが多用されています。 しかし、ArrayListはVectorに比べ軽量ですがスレッドセーフではありません。 アクセスが多いブログだと「java.util.ConcurrentModificationException」がログに大量に吐き出されています。
複数のスレッドからListにアクセスするには、Collections.synchronizedListでラップして、かつイテレーション処理を synchronized ブロックで囲うのが本来の姿です。
しかも参照のみの場合でもこの例外が出るためその修正は広範囲にわたり、パフォーマンスに影響があります。
Pebble2.0以降でも追加、削除の部分だけしか synchronized 指定はないのでこの現象が出ていると思います。
Pebbleに限らずマルチスレッドでのArrayListの多用はデッドロックを招く危険性があり大きな問題です。
(タグの foreach はどうなっているんだろ?)
J2SE5.0で追加された CopyOnWriteArrayList は書き込み時だけコピーが生成される便利なクラスで、synchronized の指定も要らないのでこれを使うのがベストかと思います。
|