2.4 Guarrding state with locks

  • ある状態変数に書き込みをするときだけ、ロックをかければよいというのは正しくなくて、変数に対してアクセスするときはいつでも行う必要がある。

ひとつ以上のスレッドによってアクセスされるかもしらない可変な状態変数にとって、
その変数に対する全てのアクセスは同じロックによって実行されなければならない。
このケースでは変数はロックによって保護されている。

  • Javaにもともと組み込まれているロックを実装するする仕組み(synchronized)を使用すべきで、自分でロックの仕組みから実装する必要はない。

どの共有された、可変な変数は正確にひとつのロックに保障されるべき。
システム保守者にどのロックであるか明確にすべき

  • 大量のデータを転送するシングルスレッドなプログラムにおいて、転送失敗時のバックアップのために10分に一度スナップショットを作る機能を追加することを考える。
  • そのときTimerTaskがほかのスレッドから呼ばれるので、スナップショットは2つのスレッドからアクセスされる。
  • つまりTimerTaskのコードは状態変数にアクセスする際に同期化を使用しなければならないし、同じデータ部分にアクセスする残りのコードの部分も同様になる。
  • つまりプログラムの中全体を通して同期化を必要になる。

ある一つ以上の変数を含む不変表明にとって、不変表明に含まれる全ての変数は同じロックによって
保護されなければならない。