2

Javaでnotify()他のオブジェクトが呼び出されていないオブジェクトの呼び出しに関連するコストはいくらですか?wait()

私がこれに興味を持っている理由は、オブジェクトのキューを持つワーカースレッドがあるからです。

スレッドは、処理する必要のあるオブジェクトがキューにあるかどうかを継続的にチェックしてループします。ループし、キューに何もない場合、スレッド呼び出しは別のオブジェクトで待機します。

別のスレッドがオブジェクトをキューに追加すると、作業スレッドが実際に待機しているかどうかに関係なく、ワーカースレッドが待機していることをオブジェクトに通知します。

誰かが何かを言う前に、それはすべて正しく同期され、例外/エラーをスローしません。

私の質問は次のとおりです。このセットアップは、ワーカースレッドがチェックを続行し、呼び出しを行わないようにするよりも遅くなります。また、オブジェクトを待機しているスレッドなしwait()で呼び出すコストはどれくらいですか。notify()

事前に助けてくれてありがとう:)

4

1 に答える 1

0

ワーカースレッドをブロックしないと、ビジーウェイトの「スピンループ」パターンになります。たとえば、次のようになります。

while (queue.isEmpty()) {
  Thread.yield();
}

私は今日(私自身の問題に関して:))条件付き待機のこのモデルについて読んでいて、そのようなモデルが通常のスキームよりも優れたパフォーマンスを示す可能性がある場合について次のメモを見つけましwait()notify()

...主な例外は、非常に短い時間内に条件が真にならなければならないことをどういうわけか知っている場合です。このような場合、無駄な回転時間は、スレッドの一時停止と再開に必要な時間よりも短い場合があります。

この本は、Doug Leaによる「Javaでの同時プログラミング:設計の原則とパターン」です。

于 2013-01-28T14:50:31.617 に答える