デッドロックのJava同期メカニズム

Javaの並行処理サイド物語シリーズ - 同期メカニズム(C)

コンパニオン「ジャワの同期同期メカニズムコンパニオン」「ジャワの揮発性同期メカニズム

実装プロセス内の2つの以上のプロセスを意味し、お互いを待っているの現象によるリソースの競合の結果は、外力の不在は、彼らはそれを促進することができません。

最初のニュースを見て:

「ATT」は2013年4月2日に国連総会で条約によって設立された国際貿易における通常兵器の国連8つのカテゴリーの監督のための共通の国際基準です。ニューヨークの国連本部で2013年6月3日には、すべての国、60以上の署名のナショナルデーによる署名のために開放されています。しかし、米国、中国とロシアは、安全保障理事会の常任3は、同じ日に署名しませんでした。その後、最大の武器生産と輸出国米国は条約に署名したが、正式に承認されていませんでした。中国とロシアはまだ条約に署名していません。2019年4月26日には、米大統領トランプは、インディアナ州で開催されたアメリカのライフル協会の年次総会では、「ATT」は、米国が条約に署名を撤回します「条約の重大な誤解を招く」である、と発表しました。トランプは、国連武器貿易条約から米国の撤退、条約の批准プロセスを停止するために上院を聞いてきます。」

実際にはこれがある:米国:ロシア、など私が最初に私はそれに署名した署名した。ロシア:中国が署名する私に署名するために私が待っています。中国:私は、米国が最初に私はそれに署名した署名のために待っています。

まあ、までの範囲。デッドロックのため。

サンプルコード

スレッドが永遠にロックを取得しようとしているロック、スレッドと他のスレッドを保持する場合、それらはブロックされません。ロックを保持し、ロックBを取得したいスレッドでは、BのスレッドBがロックを保持して取得しようと、その後、2つのスレッドが常に待機します。この場合は、デッドロックの最も単純な形式であります:

public class TestDead {
    private Object a;
    private Object b;

    public TestDead(Object a, Object b) {

        this.a = a;
        this.b = b;
    }

    public void funOne(){
        synchronized (a){
            System.out.println("finOne");
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            funTwo();
        }
    }
    public void funTwo(){
        synchronized (b){
            System.out.println("finTwo");
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            funOne();
        }
    }

}

TestDead testDead = new TestDead(new Object(), new Object());
new Thread(new Runnable() {
            @Override
            public void run() {
                testDead.funOne();
            }
        }).start();
new Thread(new Runnable() {
            @Override
            public void run() {
                testDead.funTwo();
            }
        }).start();
复制代码

次のようにプログラムの動作結果は以下のとおりです。

上記のコードは、外部の力の非存在下で、仮死スレッドをもたらすであろう。2つのスレッドが常に解放されることはありませんロックを待って、ブロッキング状態になります。

デッドロックのために必要な条件を生成します

  • 相互に排他的な条件は:一度に一つのプロセスによって占有される資源を排他的に使用されるリソース割り当てのプロセスを指します。この時点で、要求を処理するために他のリソースがある場合は、要求者にのみリリースの過程で、最大使用リソースのシェアまで待つことができます。
  • 所持して待機:プロセスは、少なくとも1つのリソースのために維持しますが、新しいリソース要求を提案されていることを、リソースが他のプロセスによって占有されてきた、この時間は、要求プロセスブロックされたが、彼らはホールドを保つために利用可能な他のリソースのため。
  • 、リソースが使用されていない以前に得られているプロセスを指し拒否することができない、作業が終了したときに自分自身だけで解放することができます:劇を強制しないでください。
  • ループ待機条件は:デッドロックが発生し、必要な処理があるいう - リソースのP1を占めて待機しているリソースの無端チェーン、P0の、すなわち、プロセス集合{P0、P1、P2、···、Pnを}; P1 P2は......、PnはP0によって占有されたリソースを待っている、占有リソースを待っています。

これらの4つの条件がある限り、システムのデッドロックとして、これらの条件の確立が避けられないが、限り、上記のいずれかの条件が満たされていないとして、それはデッドロックを発生しません、デッドロックのために必要な条件です。

デッドロックと診断を避けます

デッドロックによって引き起こされる他の多くの同時実行の危険な効果のようなことはほとんど即座に提示していません。クラスは、デッドロックの可能性がある場合、それはすべての時間は、デッドロックが発生することを意味するものではありませんが、それが可能であることだけ。デッドロックは、多くの場合、最悪の瞬間に、発生した場合-高負荷条件の下で。デッドロックは、上記のコードロックにより製造することができる查看是否存在嵌套的锁获取操作デッドロックが存在するかどうかチェック。しかし、時には複数のロック操作を取得し、それほど明白ではありません。

デッドロックの問題を回避するために、唯一可能な4つの条件のいずれかの破壊を必要とします。

  • 相互に排他的な条件を破ります。このプロセスは、特定のリソースへの同時アクセスが可能になります。いくつかのリソースは、同時アクセスを許可していない、またはスレッド安全性の問題があるので当然のことながら、このアプローチは、裁判の広い範囲ではありません。
  • ブレークと待機状態の所持。スレッドがロックを取得した後、次にどのような場合の規定により、ロックが別のロックを要求するために返却しなければなりません
  • ブレーク条件を先取りすることができません。スレッドは、独自のキーを持っていない限り、それ以外のスレッドは、常に鍵が条件の原因をつかむことではありません占めることになります。これは、プロセスが強制的にそこからいくつかのリソースパーソンの所持を取ることができます。これは、プロセスがいくつかのリソースを占めているとき、それは新しいリソースを申請し、ですが、すぐに満たすことができない、それが再適用後に、占有すべてのリソースを解放する必要があります。
  • 悪循環を断ち切るための条件を待ちます。この戦略、番号によって割り当てられたリソース、すなわち前分類番号を使用すると、いずれかのスレッドが強制ロックを取る注文することができます。

その他の危険な活動

デッドロックにもかかわらず、危険な最も一般的な活動ですが、を含むいくつかの同時その他の危険なアクティビティ、まだあります:など、飢餓、ライブロックは、

飢餓:できないスレッドは、それが必要なリソースにアクセスし、続けることができないときは、飢えを発生します。飢餓によって引き起こされる最も一般的なリソースは、CPUのクロックサイクルです。優先度が不適切に使用されている、またはロックを保持しながら、その操作(無限ループ)の終わりにはできません場合は、他のスレッドがこのロックはそれを得ることができることはありません必要があるため、スレッドの飢餓を製造することが可能です。

ライブロック:私はそれを神話の名前を与えた西西弗斯锁シーシュポスの神話をスレッドが繰り返されますので、それがスレッドをブロックしませんが、彼らがダウンして継続することはできませんが、これは、アクティブな問題の別の形態であります同じ操作を行うと、常に失敗します。複数のスレッドがその状態を変更するために応答するためにお互いに協力しており、いずれかのスレッドが実行できない場合は、それがライブロックされます。ライブロックは、通常の事務を処理するコードで発生します。あなたがメッセージを正常に処理できない場合は、メッセージ処理メカニズムは、トランザクション全体をロールバックし、キューの先頭にそれを再配置します。したがって、トランザクションを処理するコードが繰り返し呼び出されると、メッセージ処理スレッドがブロックされていないが、実現できないが、同じ誤った結果を返します。

概要

それが表示されたら、ほかにこの障害を解決する他の方法の外にアプリケーションを停止するので、デッドロック(だけでなく、他のアクティブな問題が)、非常に深刻な問題です。デザインはすべき确保线程在获取多个锁时采用一致性的顺序

おすすめ

転載: juejin.im/post/5d655cc26fb9a06ace525f8b