2.3 Locking

  • クラスの状態を管理するために複数のオブジェクトを使用する場合、それぞれがたとえアトミックであっても正常に動作しない。

状態の首尾一貫性を保つために単一のアトミック操作で関連する状態変数を更新しなさい。

2.3.1 Intrinsic locks

  • javaには排他的ロックを実現するための仕組みとしてsynchronized blockがある。
  • Servletのserviceメソッドに対してsyncronizedにするのはやりすぎ。(パフォーマンス悪くなる。)

2.3.2 Reentrancy

  • 再入可能性はロックの獲得カウントと自分自身のスレッドを強調させることで実装されている。
    • カウントが0だったら、ロックされていない
    • スレッドがロックをするとき、カウントが1増える。
    • synchronized blockを抜けると、カウントが1減る。
    • カウントが0になったら、ロックを開放する。
  • この仕組みがなかったら、synchronizedメソッドをオーバーライドしたメソッドにおいて、superメソッドを呼び出した際にdeadlockを引き起こす。