デッドロックとは何ですか
まず、そのようなライフの例を見てみましょう。川には橋があり、1台の車しか収容できず、2台の車が並行して行くことができない狭い橋のデッキがあります。 2台の車が橋の両端から橋に駆け込まれ、車Aの場合、橋のデッキの左側の道路の一部を横切って歩きます(つまり、橋の資源の一部を占めます)。橋を渡りたい場合は、車Bが右側の橋のデッキをあきらめるのを待つ必要があります。この時点では、車Aは前進できません。車Bの場合、それは橋のデッキの右側にある道路の一部を横切って歩きます(つまり、橋の資源の一部を占めています)。橋を渡りたい場合は、車Aが左側のブリッジデッキを放棄するのを待たなければなりません。この時点では、車Bが前進できません。両側の車は逆転しなかったため、お互いがブリッジデッキをあきらめるのを待っていましたが、誰も迷いをしず、際限なく待つことができませんでした。この現象は行き詰まっています。車がプロセスと比較され、ブリッジデッキがリソースとして使用される場合、上記の問題は次のように説明されています。プロセスAはリソースR1を所有し、プロセスBが占めるリソースRRを待っています。プロセスBにはリソースRRがあり、プロセスAが占めるリソースR1を待っています。さらに、リソースR1とRRは1つのプロセスのみを占めることができます。つまり、2つのプロセスは同時に占有されません。その結果、どちらのプロセスも実行し続けることはできません。他の措置が講じられない場合、このサイクルの順守状況は無期限に継続し、プロセスのデッドロックが発生します。
コンピューターシステムでは、ソフトウェアおよびハードウェアリソースがデッドロックされる場合があります。たとえば、システムには1つのCD-ROMドライバーと1つのプリンターのみがあります。 1つのプロセスがCD-ROMドライバーを所有し、プリンターに適用します。もう1つのプロセスはプリンターを所有し、CD-ROMに適用します。その結果、両方のプロセスがブロックされており、独自に切断されることはありません。
いわゆるデッドロックとは、複数のプロセスが占有するリソースを循環し、無期限に膠着状態にとどまる状況を指します。明らかに、外力がない場合、デッドロックに関与するすべてのプロセスは常にブロックされます。上記の例から、コンピューターシステムのデッドロックの基本的な理由は、リソースが限られており、不適切な動作であることがわかります。つまり、1つの理由は、システムがリソースを提供しすぎており、同時プロセスのリソース要件を満たすことにはほど遠いことです。競合するリソースによって引き起こされるこのデッドロックは、私たちの議論の中核です。例:メッセージは一時的なリソースです。ある時点で、プロセスAはプロセスBから送信されたメッセージを待っており、プロセスBはプロセスCから送信されたメッセージを待っており、プロセスCはプロセスAから送信されたメッセージを待っています。メッセージが届かない場合、3つのプロセスA、B、およびCは前進できず、プロセス通信でもデッドロックが発生しません。もう1つの理由は、不適切なプロセスの進歩順序によって引き起こされるデッドロックです。小さなリソースは、必ずしもデッドロックにつながるとは限りません。シングル紙の橋を渡る2人の人々のように、両方が最初に通過しなければならず、シングル株の橋を膠着しなければならない場合、彼らは必然的に競争リソースの行き詰まりにつながります。ただし、2人が最初に橋に行く前に橋の上に他の人がいるかどうかを確認し、橋に他の人がいない場合にのみ橋を架けていく場合、問題は解決されます。したがって、プログラムが不合理に設計され、プロセスが不適切に促進された場合、デッドロックも引き起こします。
デッドロック
T1スレッドがO1を占有し、O2を必要とする場合にのみ、T2は現時点でO2を服用し、O1がデッドロックが必要になります。 (2人の箸で食事をしている二人と同様に、彼らは両方とも他のパーティーから1つの箸が必要です)
次のコード:T1スレッドはO1を占有し、O2オブジェクトを取得した後にO1のみを放出します。 T2スレッドは最初にO2を占有し、次にO1を取得します。この時点で、O1はT1スレッドで占められ、O2はT2スレッドで占められ、T1とT2は無限に待機し、デッドロックが発生します。
パッケージJavasimple;/** * Deadlock demo * @author haokui * * */public class diesynchronized {public static void main(string [] args){/** * 2つのスレッドT1とT2を作成して起動します。両方のスレッドは、2つのオブジェクトO1とO2*/オブジェクトO1 = new Object()を共有する必要があります。オブジェクトo2 = new object();スレッドT1 =新しいスレッド(新しいT1(O1、O2));スレッドT2 =新しいスレッド(新しいT2(O1、O2)); t1.start(); t2.start(); }} // 2つのスレッドクラスを作成するt1は実行可能{オブジェクトo1;オブジェクトO2; public T1(オブジェクトO1、オブジェクトO2){this.o1 = o1; this.o2 = o2; } public void run(){// O1とO2の同期(O1){try {thread.sleep(1000); } catch(arturnedexception e){// todo auto-fenated catch block e.printstacktrace(); } synchronized(o2){system.out.println( "o2"); }}}}}}} class t2 runnable {object o1;オブジェクトO2; public T2(オブジェクトO1、オブジェクトO2){this.o1 = o1; this.o2 = o2; } public void run(){synchronized(o2){try {thread.sleep(1000); } catch(arturnedexception e){// todo auto-fenated catch block e.printstacktrace(); } synchronized(o1){system.out.println( "o1"); }}}}注:並行性は、O1とO2が共有されている場合にのみ発生します。 2つのオブジェクトは、コンストラクターを介して共有できます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。