2016-04-08 10 views
1

次のシナリオでスレッドがロックを取得する方法に疑問があります。スレッドスケジューリング - スレッドが通知後にロックを取得する方法

スレッドが3つあります。

*スレッド1がロックを取得し、*スレッド2がロックを取得し、*スレッド-3がロックを取得し、上のメソッドを通知呼び出すオブジェクト1

にwaitメソッドを呼び出すオブジェクト1

にwaitメソッドを呼び出しますobject1

ここで、JVMがスレッドをどのように起動させるかを示します。 Thread-1はモニタオブジェクトのロックを取得するか、またはThread-2はロックを取得しますか?その理由を詳しく説明してください。

すべてのスレッドが同じ優先度を持っているものとします。

おかげ

答えて

1

HIメソッドのドキュメントはjavadocs for the jdk 8状態に知らせる:

このオブジェクトのモニターで待機中のスレッドを1つ再開。 このオブジェクトを待機しているスレッドがある場合は、そのうちの1つが になるように選択されます。選択は任意であり、 実装の裁量で発生します。スレッドは、waitメソッドの を呼び出して、オブジェクトのモニタを待機します。

+0

お返事ありがとうございます。 JVMが常にThread-1を起動し、Thread-2にチャンスが与えられていない場合、ここではどうなりますか?私は公正ロックを行うためのリエントラントロックを知っています。 – Lathy

+1

詳細な回答については、http://stackoverflow.com/questions/17063426/how-to-solve-starvation-with-notify-and-notifyallをご覧ください。短い1つ:wait/notifyに頼るのではなくReentrantLockを使う – Giovanni

+1

@Lathy JVMはこれを実装しないようにOSに任せます。これはJavaで実装されているフェアロックよりはるかに効率的です。 –

1

事前に通知の順序を予測することはできません。 2つのスレッド(スレッド1またはスレッド2)のいずれかがロックを取得する可能性があります。固定オーダー通知またはロック取得ではなく、そのモデルごとにプログラムする必要があります。

関連する問題