Реализован ли ReentrantReadWriteLock как спин-блокировка?

Как работает 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)

в горячих потоках во всех моментальных снимках и в то же время высокая загрузка процессора. Похоже на спин-лок.


person cybersoft    schedule 26.02.2016    source источник


Ответы (1)


Существует стоимость, связанная с потоком локальных данных. То, что вы видите здесь, это именно это. Вы даже можете увидеть комментарий в 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 не использует спин-блокировку. Он использует объект Sync, который использует ожидание/уведомление (реализованный LockSupport.park(this)) из AbstractQueueSynchronizer.

person Pierre-Luc Bertrand    schedule 23.03.2016
comment
Спасибо за ответ! Да, я все это видел... Но некоторые люди нагло утверждали, что проблема в спин-блокировке, когда они видели в моем вопросе такую ​​трассировку стека. Я сделал копию ReentrantReadWriteLock без этих счетчиков удержания в ThreadLocal, но проверить не успел, потому что смена GC решила нашу проблему, как бы странно это не звучало... - person cybersoft; 24.03.2016
comment
Не могли бы вы поделиться своей реализацией без счетчиков удержания в ThreadLocal? Я мог бы использовать его для другой проблемы, которую мы пытаемся решить. - person Pierre-Luc Bertrand; 24.03.2016
comment
В этом нет никакой сложности: pastebin.com/jXVyk1Db но может и не сработать, т.к. они держат счетчики. Код с этим просто закомментирован, можете глянуть - person cybersoft; 25.03.2016