2016-11-23 3 views
0
public boolean containsValue(@Nullable Object value) { 
    if (value == null) { 
     return false; 
    } 
    long now = ticker.read(); 
    final Segment<K, V>[] segments = this.segments; 
    long last = -1L; 
    for (int i = 0; i < CONTAINS_VALUE_RETRIES; i++) { 
     long sum = 0L; 
     for (Segment<K, V> segment : segments) { 
      // ensure visibility of most recent completed write 
      int unused = segment.count; // read-volatile 

      AtomicReferenceArray<ReferenceEntry<K, V>> table = segment.table; 
      for (int j = 0; j < table.length(); j++) { 
       for (ReferenceEntry<K, V> e = table.get(j); e != null; e = e.getNext()) { 
        V v = segment.getLiveValue(e, now); 
        if (v != null && valueEquivalence.equivalent(value, v)) { 
         return true; 
        } 
       } 
      } 
      sum += segment.modCount; 
     } 
     if (sum == last) { 
      break; 
     } 
     last = sum; 
    } 
    return false; 
} 

есть containsValue mathed.My вопрос заключается в том, что почему только проверить modCount, когда не найден value.if другой поток вызывает операцию смывать перед «возвращает истину», это mathed будет wrong.forgive мой бедный английский.гуавы кэш containsValue

ответ

1

Да, это может быть гонка. Так может быть любая операция с использованием результата containsValue; но если он возвращает значение true, тогда значение присутствовало в какой-то момент во время вычисления метода; это лучшее, что вы могли бы сделать в любом случае.

Что касается modCount, это используется только в том случае, если значение отсутствует, потому что оно используется для определения того, изменяется ли карта одновременно и она должна выглядеть снова. Но если значение присутствовало в любое время во время итерации, тогда метод должен возвращать true, что и делает.

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