番石榴缓存包含值
guava cache containsValue
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 问题是为什么只有在找不到 value.if 其他线程在 'return true' 之前调用删除操作时才检查 modCount,这个数学运算将是 wrong.forgive我可怜的英语。
是的,这可以比赛。使用 containsValue
的结果的任何操作也是如此;但如果它 return 为真,则该值在评估该方法时的某个时刻出现;无论如何,那是您可能做的最好的事情。
就 modCount
而言,只有在值不存在时才使用它,因为它用于检测地图是否正在同时修改并且需要再次查看。但是,如果该值在迭代期间的任何时间都存在,则该方法应该 return 为真,它确实如此。
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 问题是为什么只有在找不到 value.if 其他线程在 'return true' 之前调用删除操作时才检查 modCount,这个数学运算将是 wrong.forgive我可怜的英语。
是的,这可以比赛。使用 containsValue
的结果的任何操作也是如此;但如果它 return 为真,则该值在评估该方法时的某个时刻出现;无论如何,那是您可能做的最好的事情。
就 modCount
而言,只有在值不存在时才使用它,因为它用于检测地图是否正在同时修改并且需要再次查看。但是,如果该值在迭代期间的任何时间都存在,则该方法应该 return 为真,它确实如此。