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 回答