マルチスレッドでのstatic HashMap.put()で無限ループ
負荷テスト中にCPUが100%になる場合があるとのことで、解析を依頼されました。
とりあえず、スレッドダンプを取得してもらうと、HashMap.put()メソッド内で無限ループしている様子。
??
とりあえず、ネットで情報を収集。
すると、@ITにこんな記事が見つかりました。
http://www.atmarkit.co.jp/fjava/rensai4/troublehacks10/troublehacks10_1.html
マルチスレッドでstatic HashMap.put()にアクセスした場合に、循環参照に陥るらしいです。
対策は、同期をとること。具体的には、
・ConcurrentHashMapを使用する(JDK 1.5以上の場合)
・java.util.Collections.synchronizedMap()を使用する
・synchronizedブロックで囲む
HashMap.put()の他に、get()メソッドやHashSetクラスについても同様の対策が必要。
[参考]
http://www.atmarkit.co.jp/fjava/rensai4/troublehacks10/troublehacks10_1.html
0 件のコメント:
コメントを投稿
登録 コメントの投稿 [Atom]
<< ホーム