スレッドの実験 その6Advertisementデッドロック
流れ。
スレッドAがオブジェクトaをロック スレッドBがオブジェクトbをロック スレッドAは次にオブジェクトbにロックをかけようとするが、スレッドBがロックしているから解除待ち。 スレッドBはオブジェクトaにロックをかけようとするが、スレッドAがロックしているから解除待ち。 処理が進まない。 故意にデッドロックをおこしてみる。
public class ThreadTest{
public static void main(String args[]){
Bank bnk1 = new Bank();
Bank bnk2 = new Bank();
ThreadA tha = new ThreadA(bnk1, bnk2);
ThreadB thb = new ThreadB(bnk1, bnk2);
tha.start(); //スレッド A 開始
thb.start(); //スレッド B 開始
}
}
class Bank{
private int Account = 500;
public Bank(){}
public int refMoney(){
return Account;
}
}
class ThreadA extends Thread{
int tmp;
Bank bk1, bk2;
public ThreadA(Bank b1, Bank b2){
bk1 = b1;
bk2 = b2;
}
public void run(){
synchronized(bk1){
tmp = bk1.refMoney();
//1秒停止
try{Thread.sleep(1000);}catch(Exception e){}
System.out.println("ThreadA:bk1をロック、
bk2のロック解除待ち");
synchronized(bk2){
tmp = bk2.refMoney();
}
}
}
}
class ThreadB extends Thread{
int tmp;
Bank bk1, bk2;
public ThreadB(Bank b1, Bank b2){
bk1 = b1;
bk2 = b2;
}
public void run(){
synchronized(bk2){
tmp = bk2.refMoney();
//1秒停止
try{Thread.sleep(1000);}catch(Exception e){}
System.out.println("ThreadB:bk2をロック、
bk1のロック解除待ち");
synchronized(bk1){
tmp = bk1.refMoney();
}
}
}
}
結果
ThreadB:bk2をロック、bk1のロック解除待ち ThreadA:bk1をロック、bk2のロック解除待ち <ここで処理ストップ>デッドロックが発生すると確実に処理が停止するから、複数の資源に対して複数のスレッドがロック操作を行う場合はスレッドの優先順位とかロックをかけるタイミングとか、ちゃんと考える必要がある。 Advertisement |
ショートカット・634・634ブログ ・このカテゴリのトップページに戻る ・Incubator(Pukiwiki) ・634ラボ UIコレクションギャラリー ZO-3ジェネレーター サイト検索Y!ログール |