原則として通知し、待ちます
それは、オブジェクトロックの性質によって正面に来るとき、実際にモニタロックオブジェクトヘッダのデータ構造です。次のような構造は次のようになります。
(インターネットからの写真)
いくつかのスレッドロック(入力)との競技者は、唯一のスレッドで成功したレコードの所有者構造、(取得)成功することができます。待って呼び出し、作業工程を通知し、次のとおりです。
(1)O、ロックがスレッドT1によって保持されている既存のオブジェクトは、セット構造を待って、スレッドは(実際には記録された)「乾燥する」T1となりウェイト()メソッドを呼び出します。
(2)次に、ロックT2、スレッドT2にオーナーレコードを取得するための別のスレッドが存在するであろう。
(3)t2のスレッドはoを必要としないロック、コールo.notify()/ o.notifyAll()メソッドを、スレッドがセット構造が記録待っオブジェクトo誰が教えてくれます:私、あなたが競うだけでなく、私の友人ので、保有されていない今、ロックします。
簡単に言えば、それは次のようになります。通知のオブジェクトはちょうど自分自身のスレッドだけでなく、私のロック以来の競争の外に混雑されている()/のnotifyAll()を通知し、オブジェクトの所有者は、ロックを解除するために私のスレッドに自分自身をロックされている通知を待ちます。私は、より適切なアナロジーを考えます:
(スレッド)ご宿泊のお客様は、所有者(サブジェクト)、所有者は右の時間(ロック)を取得する必要がありますを訪問する、と所有者が同じ時間(相互排他)で一人だけを受けました。
リビングルームは、ゲストのレセプションである場合には、何らかの理由で、所有者が別のゲストを受信する必要があり、その後、ホストは、そのように自分の時間の右(waitメソッド)、別の部屋に、現在の待合室にゲストを招待
リビングルームには所有者別のゲストのレセプションレセプションが終了した後、元の(そしておそらくいくつか)させ、その後、他の部屋でお客様を待ってリビングルームへと受け続けた(通知/のnotifyAllメソッド)
待って、配置するシンクブロックに通知
シンクブロックでない場合は実際には非常に簡単で、スレッドは、ターゲットロックを達成し、ロックオブジェクトの通知スレッドリリースを行い、または対抗するためにそれをロックする方法について話しませんでしたか?おそらく、メインスレッドへの通知。あなたが同期ブロックを置いていない場合、それは、ウェイクのすなわち損失、失われた覚醒の問題を生成します例えばプロデューサーよりも消費者の多く:
プロデューサーのスレッドが待機しなければならない決定の完全な箱を見つけましたが、待ち時間がシンクブロックではないので、この時点でプロデューサーのスレッドが待機していなかったので。
消費者のスレッドの呼び出しは、バッファからの生成物の摂取後()メソッドに通知し、最後の通知メッセージは無視されます。
プロデューサーのスレッドが待機()メソッドを呼び出して、待機状態に入り、知らされていなかっ。
我々は、バッファまたは1つの製品だけを使用している場合そのため、ここでの競争の条件に、我々は、紛失に気付くことがあり、生産者スレッドは永遠に待機します、あなたのプログラムがハングアップします。