1
  1. 同期関数を宣言する代わりにロックを使用してJavaで飢餓を防ぐためにより公平にする場合、タイプLockをインスタンス化できません

  2. http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.htmlのように FairLock を実装する必要がありますか? Java のロックは上記のFairLockと同じですか? FairLockはパフォーマンスを低下させると言われましたが、実際にはどうなるでしょうか

    Lock lock = new Lock();
    
4

1 に答える 1

3

おそらく、インターフェースであるjava.util.concurrent.locks.Lockをインスタンス化しようとしています。それはもちろんうまくいきません。ReentrantLockなどの実装をインスタンス化する必要があります。これは、Java で「柔軟な」ロックを行う標準的な方法であり、単純なモニター ロックでは不十分な場合に備えます。そのドキュメントには、公平性について何か言いたいことがあります。

このクラスのコンストラクターは、オプションの公平性パラメーターを受け入れます。true に設定すると、競合が発生している場合、ロックは最も長く待機しているスレッドへのアクセスを許可することを優先します。それ以外の場合、このロックは特定のアクセス順序を保証しません。多くのスレッドがアクセスする公平なロックを使用するプログラムは、デフォルト設定を使用するプログラムよりも全体的なスループットが低くなる可能性があります (つまり、低速であることが多く、多くの場合非常に低速です)。ただし、ロックの公平性は、スレッド スケジューリングの公平性を保証するものではないことに注意してください。したがって、公正なロックを使用する多くのスレッドの 1 つが、他のアクティブなスレッドが進行しておらず、現在ロックを保持していない間に、複数回連続してそれを取得する可能性があります。また、時間制限のない tryLock メソッドは公平性の設定を尊重しないことに注意してください。

于 2012-10-25T08:43:06.490 に答える