@634

スレッドの実験 その6

Advertisement

デッドロック

流れ。
スレッド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!ログール