http://www.fumikichan.net/prog/Java/se030201.jsp
|
1.デッドロックとは
マルチスレッドを行うプログラムでは、複数のスレッドがお互いにロックの解放を待ち合い続けることによりシステムWait状態になる場合があります。 この現象をデッドロック(deadlock)といい、正常なプログラミングを行っていても、特定のオブジェクトのアクセスする順序により発生してしまいます。 デッドロックが発生しないようにするには、この特定のアクセス順序のルールを検討する必要があります。
下の図でデッドロックが発生するまでの流れを説明します。
- オブジェクトAとBを持つクラスから、お互いのオブジェクトを参照するスレッド1とスレッド2を生成します。
- スレッド1はオブジェクトAのロックを取得し、オブジェクトBのロック解除を待っています。
- スレッド2はオブジェクトBのロックを取得し、オブジェクトAのロック解除を待っています。
- どちらのスレッドも互いにロックしたオブジェクトの解除を待つことになり永遠にWait状態になります。
|
|
|
デッドロックの流れ | |
|
2.プログラムの仕様
では上記のデッドロックを実際にコーディングすることにより確認してみることにします。 プログラムは1クラスでも可能ですが、なるべく「デッドロックの流れ」の図に合うように3つのソースで5クラスに分けて作成します。
簡単なプログラムの概要を下記に示します。
- オブジェクトAとBはクラスA、クラスBとし、それぞれ画面表示の2つのメソッドを持ちます。
- オブジェクトAとBの実体はメインクラス(DeadlockTest)上にあり、他のクラスに参照設定を渡します。
- メインクラス(DeadlockTest)からThreadAクラスのスレッドとThreadBクラスのスレッドを生成し、 両方のスレッドが終了したら終了メッセージを表示します。(デッドロックが発生した場合は表示されません。)
- ThreadAクラスはオブジェクトAのロックを取得して、クラスAのメソッドを実行し、その後オブジェクトBのロックを取得して、クラスBのメソッドを実行します。
- ThreadBクラスはオブジェクトBのロックを取得して、クラスBのメソッドを実行し、その後オブジェクトAのロックを取得して、クラスAのメソッドを実行します。
- どちらのスレッドクラスもメソッド呼び出し処理をスレッド処理(run)の中で複数回(100回)行います。
|
댓글 없음:
댓글 쓰기