11

この質問への答えを探すために、ステートメントに関するすべての Javaドキュメントをスキャンしましたが、うまくいきませんでした。synchronized

、、、次のコードをすべて同時に実行しようとしているとしthread1ますthread2thread3

 synchronized(lockObj) { 
     doSomething();
 }

thread1最初に取得すると仮定しdoSomething()thread2次にステートメントthread3をブロックして待機します。synchronized

質問

  1. thread1ロックを解放するとき、どのスレッドが最初に解放されますか?
  2. ロックを解除するときに適用される一般的な順序規則は何ですか?
4

1 に答える 1

21

1. スレッド 2 またはスレッド 3 のいずれか。保証はありません:

同様に、スレッドがモニターの所有権を付与される順序や、notify メソッドまたは notifyAll メソッドに応答してスレッドが復帰する順序についても、仮定を立てる必要はありません。

http://docs.oracle.com/javase/1.5.0/docs/guide/vm/thread-priorities.html#general

2. Java モニター (同期/待機/通知/通知すべて) は公平ではありません。Java 1.5 の同期プリミティブには通常、公平性を確保するためのパラメーターがあります。公平なバージョンではパフォーマンスが大幅に低下することに注意してください。通常は不公平なバージョンを使用する必要があります。統計的には、順序が厳密に強制されていなくても、すべてのスレッドに実行の機会が与えられます。

多くのスレッドがアクセスする公平なロックを使用するプログラムは、デフォルト設定を使用するプログラムよりも全体的なスループットが低くなる可能性があります (つまり、低速であることが多く、多くの場合非常に低速です)。ただし、ロックの公平性は、スレッド スケジューリングの公平性を保証するものではないことに注意してください。したがって、公正なロックを使用する多くのスレッドの 1 つが、他のアクティブなスレッドが進行しておらず、現在ロックを保持していない間に、複数回連続してそれを取得する可能性があります。また、時間制限のない tryLock メソッドは公平性の設定を尊重しないことに注意してください。他のスレッドが待機していても、ロックが使用可能であれば成功します。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html#ReentrantLock%28boolean%29

于 2012-06-30T16:35:30.430 に答える