synchronizedの挙動

synchronizedメソッドは、オブジェクト(インスタンス)に対してロックをかける。
つまり、そのメソッドにおけるthisに当たるものがロックされる。
static synchronizedメソッドは、そのクラスに対するClassオブジェクトのロックを取得する。
synchronized文は任意のオブジェクトに対してロックをかける。thisを渡せばsynchronizedメソッドより狭い範囲でロックをかけることが可能。
ロックはスレッド単位で保持されるので、synchronizedメソッド内での、同じオブジェクトの別のsynchronizedメソッドの呼び出しは、待たされることなく呼び出し可能。
この「スレッド単位でロック」という言葉、注意するケースがひとつだけある。
それはRunnableのrunメソッドを、synchronizedメソッドにオーバーライドした場合。
この場合、ロックを取得するスレッドは、runメソッドを実行するスレッドではなく、runメソッドが呼び出される側のスレッド。
すなわち、startメソッドを実行する側のスレッドと頭にいれておこう。
一言で表すと、ロックを取得するスレッドはメソッド呼び出し側スレッドってこと。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です