Javaのマルチスレッド6:マルチスレッドケーススタディ - デジタルサブトラクション(詳細ながら)

記事ソース:https://www.cnblogs.com/LeeScofiled/p/7225562.html

JAVAの特にロックのために、少し周りこれをマルチスレッド、理解するためのロック機構は、プログラムは、このレコードを見て原因を見つけ、ロック・スレッドのさまざまなを実行することが困難であるという問題があり、不明です。

1、JAVAは、各オブジェクトが、モニタ(モニタ)としても知られている、唯一つのロック(ロック)を有しています。

2、同期(同期)オブジェクトは、メソッドまたは改変方法を同期させることができます。

3、スレッドがある場合は、オブジェクトを変更するための同期メソッドに入る、それはユニークなロックにこのオブジェクトを取得します、スレッド内のロックハンドオーバーに時間がない、他のスレッドの処理にアクセスできません。コンテンツブロックを実行した後に逆ネジロック同期メソッドオブジェクト。

 

 

4、待ち時間に、オブジェクトのクラスに属し、通知、および書き換えることができない、(オンラインJDK 1.5および1.6、これは基本的に翻訳機械翻訳であるため、APIの中国語版を持って、不正確なオリジナルの英語を参照することをお勧めしますドキュメント)。

待つ:

4.1、現在のスレッドがこのオブジェクトのモニターを所有している必要がありwaitメソッドは、現在のスレッドのロックは、オブジェクトを取得する必要があります。スレッドの同期コードブロックの表現にスレッドがロックオブジェクトを取得するので、この方法では、待機同期コードブロックでなければなりません。

4.2は、この方法は、ここでは、オブジェクトのロックを失うのスレッドにしましょうと(あなたが理解していない場合は、4.1を参照して、オブジェクトのロック・スレッドを取得するためにでなければならないスレッドのwaitメソッドを実行することができるように)待ってハング。

他のスレッドがオブジェクトの通知やのnotifyAllメソッドを呼び出し、システムが複数のスレッドで現在のメソッドを待ってハングします4.3は、ランダムで待機きっかけを見つけ、スレッドを覚ます、それはロックとオブジェクトを得たまで待機します続けます。

4.4、スレッドは、目覚めされる前に出て休憩や時間、気づくことがあり欺くウェイクにタイムアウトと呼ばれていますこのような状況はめったに条件が満たされていない場合は必要なスレッドが待ち続け、スレッドが目を覚ますことを判定条件から保護するために必要なアプリケーションを練習しません。つまり、waitメソッドは、ループ内に配置する必要がありますこのように。

synchronized (obj) {
         while (<condition does not hold>)
             obj.wait(timeout);
         ... // Perform action appropriate to condition
     }
言葉を理解するだけでなく、理解することがやや困難、図に描く:
4.4.1、例えばsynchronzied 1にスレッドとして、ロックオブジェクトを取得し、他のスレッドは、プロセスブロックにメソッドを同期していません。

別のスレッドがこれを呼び出すまで、実行されていないスレッド1の実行手はその後、ここで1ハングスレッド、その後、他のスレッドがでてくることができ、ロックを失うことになる、方法を待つために4.4.2、通知またはオブジェクトのメソッドのnotifyAll。

4.4.3待機するための方法を待つのと同じ方法で、この時点で2スレッド3スレッド。

再び4.4.4、糸4、オブジェクトの別の方法に、及びオブジェクトの通知メソッドを呼び出します。

通知オブジェクトが呼び出された後4.4.5は、スレッド待ち方法は、目を覚ますロックを取得し、ダウンを続行するチャンスを待っている場所があります。他のスレッドは場所にまだ待っています。

通知:

待っているシングルスレッドウェイクアップし 、このオブジェクトのモニターでは、 この方法では、待機中に待機しているスレッドを覚まします。
エイブルのロックONアットザ現在のスレッドまでに進んで意志によって目覚めたことは、このオブジェクトを放棄スレッドされていない。それはオブジェクトロックされるまで、この起こされたスレッドが実行されません。
再開されたスレッドは、通常で競う積極的にこのオブジェクトを同期させるために、競合する可能性のある他のスレッドとやり方スレッドは他のスレッドがオブジェクトをロックするとの競争に行く目覚めなければ。(発現スレッドがオブジェクトのロックを取得しない限り、すぐに意味するものではありません目を覚ます。)
 唯一のスレッドワンAT AN A Timeオブジェクトの独自のCANモニター。これは、オブジェクトのロックを取得するには、この時点では一つのスレッドだけです。所有者だけでIS Aそのスレッドで、この、メソッドと呼ばれるべきこのオブジェクトのモニターのこのアプローチは、コールへのオブジェクトロック・スレッドを取得する必要があります。
3つの方法がオブジェクトロックを取得がありますオブジェクトを実行する同期インスタンスAの方法により、そのオブジェクトの実行同期方法。


 
{@codeの本体実行することにより、オブジェクトに同期させる同期}文ターゲット同期ブロックの実装。
そのクラスの静的メソッドAを同期{実行することにより、クラスの@code}タイプのオブジェクトクラスは、(ロックされたクラスを示す)静的同期方法を実行します。

最後に、なぜ我々は判断せずにではなく、もし、一方で、またはのような文書を使用する必要があり、以下のコードについての説明
synchronized (obj) {
         while (<condition does not hold>)
             obj.wait(timeout);
         ... // Perform action appropriate to condition
     }

 上記の例では、条件がここにある場合

if(num == 1){
  wait(); 
}
 
num++;
notify();

待機三つの方法のNUMにスレッドがゼロであれば、それはNUM + 1にするためにゼロになるまで、私は、numは1であるのを待つ必要があります

スレッド1つの伴流がオブジェクトロックがされていれば、この時間の後、NUM 1に、方法を通知するために実行されたときにスレッド2がロックを取得== 1 NUMを決定するために、再行うべき numは依然として継続しなければならない、場合に1であり、ハングアップするのを待ちます。

それがあればあるここならば、それはスレッド1がこの条件ならばNUM == 1に入る前に満たしていることを示しているが、判定が満たさNUM == 1 Shiqueこの条件ではない場合。私はNUM 1を必要とするとき、既知によると、私は裁判官がここに間違っているそうだとすれば、待っていました。

そこにいる間に交換されている場合は、スレッド1スレッドロックはそれを得るかに持っているときは、目を覚ます裁判官を再行う numは== 1は、このスレッドが待機していきません場合は、。

公開された52元の記事 ウォン称賛7 ビュー10000 +

おすすめ

転載: blog.csdn.net/YKWNDY/article/details/104850315