Javaのデッドロックとソリューション

コンセプトのデッドロック

      「デッドロック」とは:

      複数のスレッドそれぞれがいくつかの共有リソースを占有し、他のスレッドが互いのリソースを解放するのを待っている2つの以上のスレッドで、その結果、互いのリソースが占有されるのを待つ、状況は実行を停止しました。

      したがって、「デッドロック」の問題についての同期ブロックを持っている必要があります「ロック2以上のオブジェクトは、」発生する可能性があります。次の場合、「メークスレッド」シンクブロックを実行するために、「ミラーオブジェクト」、「口紅オブジェクトを」持っている必要があります。お互いが化粧するためには、お互いにリソースを解放するためので、実際の走行時間、「小鴨化粧スレッド」、「ビッグ地獄メイクスレッドを」「ミラーオブジェクトを」持っている持っている「口紅のオブジェクトは、」待っています。このように、2つのスレッドが実行し続けることができない「デッドロック状態」を形成するためにお互いを待ちます。

デモデッドロック:

class Lipstick {//口红类
 
}
class Mirror {//镜子类
 
}
class Makeup extends Thread {//化妆类继承了Thread类
    int flag;
    String girl;
    static Lipstick lipstick = new Lipstick();
    static Mirror mirror = new Mirror();
 
    @Override
    public void run() {
        // TODO Auto-generated method stub
        doMakeup();
    }
 
    void doMakeup() {
        if (flag == 0) {
            synchronized (lipstick) {//需要得到口红的“锁”;
                System.out.println(girl + "拿着口红!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
 
                synchronized (mirror) {//需要得到镜子的“锁”;
                    System.out.println(girl + "拿着镜子!");
                }
 
            }
        } else {
            synchronized (mirror) {
                System.out.println(girl + "拿着镜子!");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lipstick) {
                    System.out.println(girl + "拿着口红!");
                }
            }
        }
    }
 
}
 
public class TestDeadLock {
    public static void main(String[] args) {
        Makeup m1 = new Makeup();//大丫的化妆线程;
        m1.girl = "大丫";
        m1.flag = 0;
        Makeup m2 = new Makeup();//小丫的化妆线程;
        m2.girl = "小丫";
        m2.flag = 1;
        m1.start();
        m2.start();
    }
}

      示すような結果(2つのスレッドが互いのリソースを待っている静止しています):

 

デッドロックソリューション

      デッドロックは、この問題を解決するために、「シンクブロックは、複数のオブジェクトのロックの原因を保持する必要がある」、アイデアは非常に単純であるためであった:同じブロック、同時にロックで2つのオブジェクトを保持していません。デッドロックの場合、上述のように、示された例に変更。

問題のデッドロック解決策:

class Lipstick {//口红类
 
}
class Mirror {//镜子类
 
}
class Makeup extends Thread {//化妆类继承了Thread类
    int flag;
    String girl;
    static Lipstick lipstick = new Lipstick();
    static Mirror mirror = new Mirror();
 
    @Override
    public void run() {
        // TODO Auto-generated method stub
        doMakeup();
    }
 
    void doMakeup() {
        if (flag == 0) {
            synchronized (lipstick) {
                System.out.println(girl + "拿着口红!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
 
            }
            synchronized (mirror) {
                System.out.println(girl + "拿着镜子!");
            }
        } else {
            synchronized (mirror) {
                System.out.println(girl + "拿着镜子!");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            synchronized (lipstick) {
                System.out.println(girl + "拿着口红!");
            }
        }
    }
}
 
public class TestDeadLock {
    public static void main(String[] args) {
        Makeup m1 = new Makeup();// 大丫的化妆线程;
        m1.girl = "大丫";
        m1.flag = 0;
        Makeup m2 = new Makeup();// 小丫的化妆线程;
        m2.girl = "小丫";
        m2.flag = 1;
        m1.start();
        m2.start();
    }
}

  示すような結果(2つのスレッドが実行中のプログラムを終了するために必要なリソースを取得することができます):

 

公開された150元の記事 ウォンの賞賛9 ビュー20000 +

おすすめ

転載: blog.csdn.net/ZGL_cyy/article/details/104357084