0

どのように機能しReentrantReadWriteLockますか?スピンロックですか?

質問は、Elasticsearch から来ています。

   java.lang.ThreadLocal$ThreadLocalMap.expungeStaleEntry(Unknown Source)
   java.lang.ThreadLocal$ThreadLocalMap.remove(Unknown Source)
   java.lang.ThreadLocal$ThreadLocalMap.access$200(Unknown Source)
   java.lang.ThreadLocal.remove(Unknown Source)
   java.util.concurrent.locks.ReentrantReadWriteLock$Sync.tryReleaseShared(Unknown Source)
   java.util.concurrent.locks.AbstractQueuedSynchronizer.releaseShared(Unknown Source)
   java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.unlock(Unknown Source)

すべてのスナップショットでホット スレッドが発生し、同時に CPU 使用率が高くなります。スピンロックのようです。

4

1 に答える 1

0

スレッド ローカル データに関連するコストがあります。ここに表示されているのは、まさにこれです。ReentrantReadWriteLock で、これについて言及し、スレッド ローカル データのデータをキャッシュすることで最適化するコメントを確認することもできます。

コメント:

    /**
     * The hold count of the last thread to successfully acquire
     * readLock. This saves ThreadLocal lookup in the common case
     * where the next thread to release is the last one to
     * acquire.
     * [...]
     */
    private transient HoldCounter cachedHoldCounter;

ReentrantReadWriteLock はスピンロックを使用しません。これは、AbstractQueueSynchronizer からの (LockSupport.park(this) によって実装された) 待機/通知を使用する Sync オブジェクトを使用します。

于 2016-03-23T23:47:22.513 に答える