2016-02-26 7 views
0

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

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

ответ

0

Существует стоимость, связанная с локальными данными потока. То, что вы здесь видите, именно это. Вы даже можете увидеть комментарий в ReentrantReadWriteLock mentionning это и его оптимизации путем кэширования данных локальных данных потоков:

Комментарий:

/** 
    * 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, который использует wait/notify (реализуемый LockSupport.park (this)) из AbstractQueueSynchronizer.

+1

Благодарим за ответ! Да, я все это видел ... Но некоторые люди нагло заявили, что проблема в спин-блокировке, когда они видят такую ​​стеклянную фигуру в моем вопросе. Я сделал копию «ReentrantReadWriteLock» без этих счетчиков удержания в «ThreadLocal», но у меня не было времени на тестирование, потому что изменение GC решило нашу проблему, как это ни странно ... – cybersoft

+0

Не согласитесь ли вы поделиться своей реализацией без удерживать счетчики в ThreadLocal? Я могу использовать его для другой проблемы, которую мы пытаемся решить. –

+0

В этом нет никаких проблем: http://pastebin.com/jXVyk1Db, но это может не сработать, потому что на этих счетчиках есть какая-то логика. Код с этим просто прокомментирован, вы можете посмотреть – cybersoft

 Смежные вопросы

  • Нет связанных вопросов^_^