次のシナリオでスレッドがロックを取得する方法に疑問があります。スレッドスケジューリング - スレッドが通知後にロックを取得する方法
スレッドが3つあります。
*スレッド1がロックを取得し、*スレッド2がロックを取得し、*スレッド-3がロックを取得し、上のメソッドを通知呼び出すオブジェクト1
にwaitメソッドを呼び出すオブジェクト1
にwaitメソッドを呼び出しますobject1
ここで、JVMがスレッドをどのように起動させるかを示します。 Thread-1はモニタオブジェクトのロックを取得するか、またはThread-2はロックを取得しますか?その理由を詳しく説明してください。
すべてのスレッドが同じ優先度を持っているものとします。
おかげ
お返事ありがとうございます。 JVMが常にThread-1を起動し、Thread-2にチャンスが与えられていない場合、ここではどうなりますか?私は公正ロックを行うためのリエントラントロックを知っています。 – Lathy
詳細な回答については、http://stackoverflow.com/questions/17063426/how-to-solve-starvation-with-notify-and-notifyallをご覧ください。短い1つ:wait/notifyに頼るのではなくReentrantLockを使う – Giovanni
@Lathy JVMはこれを実装しないようにOSに任せます。これはJavaで実装されているフェアロックよりはるかに効率的です。 –