都内で活動するフリーランスエンジニアのトラブルシュート日記

2011年3月20日日曜日

マルチスレッドでの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]

<< ホーム