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

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

Upload: hiroyuki-ohnaka

Post on 28-May-2015

11.759 views

Category:

Documents


0 download

TRANSCRIPT

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

真にスレッドセーフなHashMapとは

2013/11/16

第四回 #渋谷java

せとあずさ♂

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

• @setoazusa

• http://blog.fieldnotes.jp/

• #tddbc 横浜(2011~2013)

• #agilesamurai #横浜道場

• #yokohamarb

• 最近、MacからWindows8に乗り換えました

• チャンキヨかわいいよチャンキヨ

• miwaは自慢の妹です

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

スレッドセーフとは…?

• クラスがスレッドセーフであるかどうかということは、そのクラスが使われるコンテキストに強く依存します

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

Java並行処理プログラミング読んでください

http://www.amazon.co.jp/dp/4797337206/

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

スレッドセーフなHashMap?

• ConcurrentHashMap使えばいいんじゃね?

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

ConccurentHashMapはHashMapではありません!

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

すなわち

map.put(“key”, null);

HashMap → そのまま通す

ConccurentHashMap → ぬるぽ

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

これはバグではありません

http://docs.oracle.com/javase/jp/7/api/java/util/Map.html#put%28K,%20V%29

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

• やむを得ないので、Collections#synchronizedMapを使うわけですが…

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

• synchronizedMapって、iterator(foreach)を回す場合は呼び出し元で同期する必要があるじゃないですか?

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

• 呼び出し元でどうやっても同期できないケースが1つだけあります。

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

それはシリアライズ

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

どうする?

• privateだから、継承できない

• 呼び出し元は 標準APIの中

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

どんなケースでひっかかったのか

• WebアプリのHttpSessionにHashMapを格納していて、

• TomcatのセッションクラスタリングがレプリケーションのためにHashMapをシリアライズして、

• そのシリアライズの最中にリクエストからの処理(シリアライズとは別スレット)がHashMapにput

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

結論

• スレッドごとに、オブジェクトを分割すればいい

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

https://gist.github.com/azusa/7052618

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

まとめ

• クラスがスレッドセーフかどうかはコンテキストに依存するということを理解しない人は、豆腐の角に頭をぶつけて(ry

• コレクションAPIには地雷があります

• スケールアウトの容易さという点について、railsが羨ましいです

• Java並行処理プログラミング読みましょう