検索

ホームページ  >  に質問  >  本文

java - ReentrantLockとSynchronized

リソースの競合がそれほど激しくない場合、Synchronized のパフォーマンスは ReetrantLock よりも優れています。ただし、リソースの競合が激しい場合、Synchronized のパフォーマンスは数十分の 1 に低下しますが、ReetrantLock のパフォーマンスは通常のままである可​​能性があります。

(1) これはなぜですか?

(2) ReentrantLock は軽量ロックですか?軽量ロックとは何ですか?名前だけは聞いたことがあるが、具体的な実装は見たことがない

synchronized を使用する場合、プログラムが正しく実行されない場合、例外がスローされますが、クリーンアップ作業は行われません。 ReentrantLock を使用すると、ロックを取得しようとしても最終的には取得できず、他の誰かがロックを取得した場合に、その場を離れて別のことを実行できます (ただし、ここでやりたいのは、ロックを取得した後に特定の操作を実行することです) )、ロックが解放されるまで待つ代わりに、今すぐ他のことの実行に切り替えるのはあまり意味がないようです。

天蓬老师天蓬老师2752日前829

全員に返信(2)返信します

  • 仅有的幸福

    仅有的幸福2017-05-17 10:05:59

    まず第一に、あなたが言及した状況は、ReentrantLock が最初に Java 1.5 に導入されたときにのみ存在しました。Java 1.6 では、基本的に ReentrantLock の実装と一致する Synchronized の実装アルゴリズムが変更されているため、2 つの間のパフォーマンスの差はすでに非常に大きくなっています。小さい。
    軽量ロックに関しては、これは Java 1.6 で導入されたロックのパフォーマンスを向上させる方法であり、JVM レベルに属しており、特定の実装はありません。
    ロックが解放されるまで待ちたい場合は、Lock.lock()を使用してロックを取得できます。Lock.tryLock()を使用するとロックを取得しようとしているため、ロックを取得できない場合があります。

    返事
    0
  • ringa_lee

    ringa_lee2017-05-17 10:05:59

    同期された読み取りページと書き込みページは相互に排他的であることが簡単に理解できますが、ReentrantLock は読み取りロックと書き込みロックを共有できますが、ここから見ると、ReentrantLock は読み取りと書き込みのロックを共有します。書き込み量を減らすとパフォーマンスは大幅に向上しますが、コードは同期よりも複雑になり、制御が適切でないと問題が発生しやすくなります。

    返事
    0
  • キャンセル返事