Javaでマルチスレッド
なるべく使わずに済ませたい気持ち。
マルチスレッド化する時に考えること
変数・状態(=メモリ)を扱うような記述をなるべく避けること。ステートレスにすること。
でもメモリの使用量が多くなりすぎないようにすること
処理が全てスレッドセーフなオブジェクト・操作を使用していること
Javaのバージョンや提供元によってスレッドセーフかどうかは変わりうる。
HotSpot JVMでは、javax.xml.bind.Marshallerのmarshalメソッドはスレッドセーフではない。 処理系によってはlongへの代入だけでもスレッドセーフではない。
32bitのJVMでは、64bitの値の操作を2回に分けて行うため。
スレッドセーフでない処理は synchronized で同期させること
でもデッドロックが起こらないようにすること
同期させる範囲は必要最低限の一連のまとまりとすること。細かすぎても広すぎてもいけない。
DBのトランザクションと同じ。
ある synchronized の同期は同じクラス・同じインスタンス内でのみ有効な点に注意すること
異なるクラスや、同じクラスの違うインスタンスに対しては無力