2

Мой вопрос о предложении в документе:«scanAndLockForPut» в ConcurrentHashMap JDK1.7

В отличие от большинства методов, вызов метода равных не экранированы: Поскольку скорость обхода не имеет значения, мы могли бы а также поможет разогреть связанный код и получить доступ.

Я не могу понять приведенное выше предложение. В частности, что означает «не экранированный» означает? И почему мы можем «разогреть связанный код»?

scanAndLockForPut

private HashEntry<K,V> scanAndLockForPut(K key, int hash, V value) { 
HashEntry<K,V> first = entryForHash(this, hash); 
HashEntry<K,V> e = first; 
HashEntry<K,V> node = null; 
int retries = -1; // negative while locating node 
while (!tryLock()) { 
    HashEntry<K,V> f; // to recheck first below 
    if (retries < 0) { 
     if (e == null) { 
      if (node == null) // speculatively create node 
       node = new HashEntry<K,V>(hash, key, value, null); 
      retries = 0; 
     } 
     else if (key.equals(e.key)) 
      retries = 0; 
     else 
      e = e.next; 
    } 
    else if (++retries > MAX_SCAN_RETRIES) { 
     lock(); 
     break; 
    } 
    else if ((retries & 1) == 0 && 
      (f = entryForHash(this, hash)) != first) { 
     e = first = f; // re-traverse if entry changed 
     retries = -1; 
    } 
} 
return node; 
+0

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

ответ

0

В частности, что "не экранированные" означает?

В этом контексте «экранированный» означает проверку личности перед тем, как звонить равным. Левая сторона следующего утверждения также взяты из CHM:

if ((k = e.key) == key || (e.hash == hash && key.equals(k))) 

Таким образом, «не экранированы» означает пропуск проверки идентичности.

И почему мы можем «разогреть связанный код»?

Put и получить с помощью метода Equals на ключ, чтобы определить спичкой и в прогревания случае более важно, чтобы определить, что не соответствует, который всегда будет вызов равно, даже если вы скрининг идентичности , Если ожидающие потоки все начинают вызывать key.equals, которые сделают его «горячим» и вызывают компиляцию JIT раньше. Метод более быстрых равных означает меньшее время, удерживающее блокировку сегмента во время старта.

Также важно отметить, что в JDK 8 все это было изменено.

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

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