2009年3月18日水曜日

いまさらオブジェクト

いまさらjava.lang.Object#notify()とwait()...でもjavadocの説明じゃ解らんよね。以下はnotify()の例。

このオブジェクトのモニターで待機中のスレッドを 1 つ再開します。

えー?サンプルくれよ、みたいな。

スレッドがオブジェクトのモニターのオーナになる方法は、次の 3 通りがあります。
  • オブジェクトの synchronized インスタンスメソッドを実行する
  • オブジェクトを同期化する synchronized 文の本体を実行する
  • Class 型のオブジェクトの場合は、そのクラスの syncronized static メソッドを実行する
平たく書いて欲しい。まじで。

結論としてはwait()/notify()はsynchronizedブロックの中でロックの対象になっているオブジェクトに使え、だ。
もうちょっとちゃんと書くと、synchronizedブロックを準備しただけではそれを実行するスレッドの順序の保証が出来ないので(先に呼んだもん勝ち)、やりたいならwait()/notify()を使ってちゃんと順序保証しなさい、だ。

多分よーく読むと解るんだろうけど...

後輩M(2人居る!)には少し省略して話をしてしまったので、調べた結果でした。

ちなみに近代Java(Java5以降なので)だとこんな事しなくても順序保証された並列処理ができるようになってる。
java.util.concurrentとかjava.util.concurrent.atomicとか。ちょーきもちいー。