ホームページ > Java > &#&チュートリアル > Java におけるデッドロックの概念と解決策

Java におけるデッドロックの概念と解決策

零下一度
リリース: 2017-07-20 13:41:31
オリジナル
2903 人が閲覧しました

1. プロセスのデッドロックと解決策

1. 重要なヒント

(1) デッドロックの概念とデッドロックの根本原因をマスターします。

(2) デッドロックの必要条件を理解する - 相互排除条件、非プリエンプション条件、占有および適用条件、ループ待機条件の 4 つの条件が同時に満たされる必要があります。

(3) デッドロックの一般的な解決方法を覚え、デッドロックの予防と回避の基本的な考え方を習得します。

(4) デッドロック防止戦略におけるリソースの秩序ある割り当て戦略をマスターする。

(5) プロセス安全シーケンスの概念とデッドロックと安全シーケンスの関係を理解する。

(6) バンカーのアルゴリズムを理解する。

(7) リソース割り当て図を理解する。

(8) デッドロックの検出と回復の考え方を理解する。

2. デッドロックについて、私の個人的な理解:

一定の期間勉強した後、私が理解したデッドロックの概念は、たとえば、2 つのプロセスがあり、各プロセスは 2 つのロック (ロック 1) によってロックされている、というものです。 、ロック2)、ロックされています。違いは、ロックを適用する場所が 2 つのプロセスで異なることです。その結果、プロセスを完全に起動するには内部ロックが必要になりますが、このロックはたまたま別のプロセス内にあります。別のプロセスが内部プロセスを完全に開始 (または実行) するために必要なロックは、別のプログラム内にあります。このように、それらは相互に結びついており、準備はできているが実行できない状態にあります。デッドロック状態を引き起こしました。私の理解に基づいて概略図を描きました:

3. デッドロックに関する簡単なコード:
public class Test15 {public static void main(String[] args) throws InterruptedException {new Thread(new DeadLockThread(true)).start();//Thread.sleep(10);在中间用上它可以使结果交替出现,我是为了看死锁的效果,用它对比一下。new Thread(new DeadLockThread(false)).start();
    }
}class DeadLockThread implements Runnable {static Object o1 = new Object();static Object o2 = new Object();private boolean flag;

    DeadLockThread(boolean flag) {this.flag = flag;
    }public void run() {if (flag == true) {while (true) {synchronized (o1) {
                    System.out.println("这是锁o1");synchronized (o2) {
                        System.out.println("这是锁o2");
                    }
ログイン後にコピー

出力結果:

4. 補足:
デッドロックについて, いろいろ調べてみたのですが、この問題はかなり複雑な気がします。この段階では、これらの単純な原則だけが理解されています。また、デッドロックが発生するには、ある 4 つの条件が満たされる必要があることも大まかに理解できます。
1) 相互排他条件:
は、プロセスによる割り当てられたリソースの排他的使用を指します。つまり、特定のリソースは、一定期間内に 1 つのプロセスによってのみ占有されます。この時点でリソースを要求している他のプロセスがある場合、要求者はリソースを占有しているプロセスが解放されるまで待つことしかできません。
2) リクエストとホールドの条件:
は、プロセスが少なくとも 1 つのリソースを維持しているが、新しいリソース要求を行っており、その時点でリソースが他のプロセスによって占有されている、要求しているプロセスがブロックされていることを意味します。ただし、リソースはすでに取得されています。他のリソースは変更されません。
3) 非剥奪条件:
は、プロセスが取得したリソースを指します。使い果たされる前に剥奪することはできず、使い果たされた場合にのみ解放できます。
4) ループ待機条件:
は、デッドロックが発生したときにプロセス、つまりリソー​​スの循環チェーン、つまりプロセス セット {P0, P1, P2,...,Pn} 内の P0 が存在する必要があることを意味します。待機しています P1 が占有しているリソース、P1 が占有しているリソースを待機しています、...、Pn は P0 が占有しているリソースを待機しています。
添付:
1) sleep() メソッドを呼び出しても、スレッドは保持している同期ロックを解放できません。また、この期間中、他のスレッドの動作を妨げることはありません
2) wait() を呼び出します。メソッドを実行すると、現在実行中のスレッドは待機状態に入り、他のスレッドがこのオブジェクトの Notice() メソッドまたは NoticeAll() メソッドを再度呼び出してウェイクアップするのを待ちます。そうでない場合、スレッドは指定された待機時間の経過後に自動的にウェイクアップします。
スレッドが 1 つ以上のオブジェクトの同期ロックを所有している場合、wait() を呼び出した後、スレッドは wait() メソッドが呼び出されたオブジェクトに限らず、保持しているすべての同期リソースを解放します。
3) 実際の開発では、デッドロックは一般に深く隠されており、一度デッドロックが発生すると、必然的にプログラムの麻痺につながります。したがって、それは避けなければなりません。

以上がJava におけるデッドロックの概念と解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート