真にスレッドセーフな
HashMapとは
2013/11/16
第四回 #渋谷java
せとあずさ♂
•
•
•
•

@setoazusa
http://blog.fieldnotes.jp/
#tddbc 横浜(2011~2013)
#agilesamurai #横浜道場

•
•
•
•

#yokohamarb
最近、MacからWind...
スレッドセーフとは…?
• クラスがスレッドセーフであるかどうか
ということは、そのクラスが使われるコ
ンテキストに強く依存します
Java並行処理プログラミング読んでください

http://www.amazon.co.jp/dp/4797337206/
スレッドセーフなHashMap?
• ConcurrentHashMap使えばいいんじゃ
ね?
ConccurentHashMapはHashMap
ではありません!
すなわち
map.put(“key”, null);
HashMap → そのまま通す
ConccurentHashMap → ぬるぽ
これはバグではありません

http://docs.oracle.com/javase/jp/7/api/java/util/Map.html#put%28K,%20V%29
• やむを得ないので、
Collections#synchronizedMapを使うわ
けですが…
• synchronizedMapって、
iterator(foreach)を回す場合は呼び出し
元で同期する必要があるじゃないです
か?
• 呼び出し元でどうやっても同期できない
ケースが1つだけあります。
それはシリアライズ
どうする?
• privateだから、継承できない
• 呼び出し元は 標準APIの中
どんなケースでひっかかったのか
• WebアプリのHttpSessionにHashMapを
格納していて、
• Tomcatのセッションクラスタリングがレ
プリケーションのためにHashMapをシリ
アライズして、
• そのシリアライズの最中に...
結論
• スレッドごとに、オブジェクトを分割す
ればいい
https://gist.github.com/azusa/7052618
まとめ
• クラスがスレッドセーフかどうかはコン
テキストに依存するということを理解し
ない人は、豆腐の角に頭をぶつけて(ry
• コレクションAPIには地雷があります
• スケールアウトの容易さという点につい
て、railsが羨ましいです
•...
Upcoming SlideShare
Loading in …5
×

真にスレッドセーフなHash mapとは #渋谷java

12,566 views
12,355 views

Published on

0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
12,566
On SlideShare
0
From Embeds
0
Number of Embeds
483
Actions
Shares
0
Downloads
14
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

真にスレッドセーフなHash mapとは #渋谷java

  1. 1. 真にスレッドセーフな HashMapとは 2013/11/16 第四回 #渋谷java せとあずさ♂
  2. 2. • • • • @setoazusa http://blog.fieldnotes.jp/ #tddbc 横浜(2011~2013) #agilesamurai #横浜道場 • • • • #yokohamarb 最近、MacからWindows8に乗り換えました チャンキヨかわいいよチャンキヨ miwaは自慢の妹です
  3. 3. スレッドセーフとは…? • クラスがスレッドセーフであるかどうか ということは、そのクラスが使われるコ ンテキストに強く依存します
  4. 4. Java並行処理プログラミング読んでください http://www.amazon.co.jp/dp/4797337206/
  5. 5. スレッドセーフなHashMap? • ConcurrentHashMap使えばいいんじゃ ね?
  6. 6. ConccurentHashMapはHashMap ではありません!
  7. 7. すなわち map.put(“key”, null); HashMap → そのまま通す ConccurentHashMap → ぬるぽ
  8. 8. これはバグではありません http://docs.oracle.com/javase/jp/7/api/java/util/Map.html#put%28K,%20V%29
  9. 9. • やむを得ないので、 Collections#synchronizedMapを使うわ けですが…
  10. 10. • synchronizedMapって、 iterator(foreach)を回す場合は呼び出し 元で同期する必要があるじゃないです か?
  11. 11. • 呼び出し元でどうやっても同期できない ケースが1つだけあります。
  12. 12. それはシリアライズ
  13. 13. どうする? • privateだから、継承できない • 呼び出し元は 標準APIの中
  14. 14. どんなケースでひっかかったのか • WebアプリのHttpSessionにHashMapを 格納していて、 • Tomcatのセッションクラスタリングがレ プリケーションのためにHashMapをシリ アライズして、 • そのシリアライズの最中にリクエストか らの処理(シリアライズとは別スレット)が HashMapにput
  15. 15. 結論 • スレッドごとに、オブジェクトを分割す ればいい
  16. 16. https://gist.github.com/azusa/7052618
  17. 17. まとめ • クラスがスレッドセーフかどうかはコン テキストに依存するということを理解し ない人は、豆腐の角に頭をぶつけて(ry • コレクションAPIには地雷があります • スケールアウトの容易さという点につい て、railsが羨ましいです • Java並行処理プログラミング読みましょ う

×