JAVAマルチスレッドのデッドロック

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/weixin_42947972/article/details/102776765

例:

class Test implements Runnable{
    private boolean flag;
    Test(boolean flag) {
        this.flag = flag;
    }

    public void run(){
        if (flag){
            synchronized (MyLock.locka){
                System.out.println("if.....locka....");
                synchronized(MyLock.lockb){
                    System.out.println("if.....lockb....");
                }
            }
        }
        else{
            synchronized (MyLock.lockb){
                System.out.println("else.....lockb....");
                synchronized(MyLock.locka){
                    System.out.println("else.....locka....");
                }
            }
        }
    }
}
class MyLock {
    public static final Object locka = new Object();
    public static final Object lockb = new Object();
}
public class Demo{
    public static void main(String[] args){
        Test a = new Test(true);
        Test b = new Test(false);
        Thread t1 = new Thread(a);
        Thread t2 = new Thread(b);
        t1.start();
        t2.start();
    }
}

メインスレッドのスレッドによって開始されました

 Test a = new Test(true);
 Test b = new Test(false);

そして、それらのアドレスが与えられているに置くt1 t2作成Threadオブジェクト

 		Thread t1 = new Thread(a);
        Thread t2 = new Thread(b);

あなたはその後、与えていない場合

	 t1.start();
	 t2.start();

デフォルトの実行は、無意味な...実行されます





メインスレッドメインの実行を

 Test a = new Test(true);
 Test b = new Test(false);

それらの二つのように、flagこれらのタグが同じではない、aはtrue、bがありますfalse

そして、メインメインスレッド2つのスレッドのオープンまで下がるし続けます

		t1.start();
        t2.start();

このとき、t1はであるtrue
彼が締結したので、また、単に、それを実行するCPU

if (flag){
            synchronized (MyLock.locka){
                System.out.println("if.....locka....");
                synchronized(MyLock.lockb){
                    System.out.println("if.....lockb....");
                }
            }
        }

取得MyLock.lockaロック
されpublic static final Object locka = new Object();
た出力をif.....locka....

このときCPUが突然スレッドT1を実行しない、T2スレッドが実行する
(CPUがランダムに行われるため!!!)
第二そうFALSの実装であるため

else{
            synchronized (MyLock.lockb){
                System.out.println("else.....lockb....");
                synchronized(MyLock.locka){
                    System.out.println("else.....locka....");
                }
            }
        }

この時間は、しまったMyLock.lockbロックが
されpublic static final Object lockb = new Object();
、その後、出力を実行します。else.....lockb....
あなたが入力したいときsynchronized(MyLock.locka)文を、T1ロックが発見されており、これはで繰り返し取得されていました...

CPUれるまでのT1に再ランダム化し
、実行するスレッドsynchronized(MyLock.lockb)の文を、しかしsynchronized(MyLock.lockb)文はt2がかかってきた

繰り返し、この時間t1を取得するには...

CPU t2までの再ランダム化されるまで、その入り口につながる、前後に取得することはできません...マルチスレッドのデッドロック

T2は時々 CPUの最初の実行をつかむです...が、結果は同じですから抜け出すことができない、来ることができませんでした...
だけで同じ出力ではありません...

一部の人々はまた、正常に実行できる可能性がありますが、唯一の理想的な状態で...デッドロックが遅かれ早かれ発生サイクルを追加しようとすることがあります...

図実行効果(1):

T1これは、CPUをつかむために、右の最初の実装です
ここに画像を挿入説明
。これは、ダウンして行くことはありません...




図実行効果(2):

T2これは、CPUをつかむために、右の最初の実装である
ここに画像を挿入説明
、それがダウンしないように...

おすすめ

転載: blog.csdn.net/weixin_42947972/article/details/102776765