guava cache containsValue

时间:2016-11-23 03:16:35

标签: java guava

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。我的问题是,为什么只在没有找到值时检查modCount。如果其他线程在&#39;返回true之前调用remove操作,这个mathed将是错误的。原谅我的穷人英。

1 个答案:

答案 0 :(得分:1)

是的,这可以比赛。任何操作都可以使用containsValue的结果;但是如果它返回true,则在评估方法时某个点出现该值;无论如何,这是你可能做的最好的事情。

modCount而言,只有当值不存在时才会使用,因为它用于检测地图是否被同时修改并且需要再看一遍。但是如果值在迭代期间的任何时间出现,那么该方法应该返回true,它就是。