in src/main/java/org/apache/commons/collections4/map/ConcurrentReferenceHashMap.java [1823:1866]
public int size() {
final Segment<K, V>[] segments = this.segments;
long sum = 0;
long check = 0;
final int[] mc = new int[segments.length];
// Try a few times to get accurate count. On failure due to
// continuous async changes in table, resort to locking.
for (int k = 0; k < RETRIES_BEFORE_LOCK; ++k) {
check = 0;
sum = 0;
int mcsum = 0;
for (int i = 0; i < segments.length; ++i) {
sum += segments[i].count;
mcsum += mc[i] = segments[i].modCount;
}
if (mcsum != 0) {
for (int i = 0; i < segments.length; ++i) {
check += segments[i].count;
if (mc[i] != segments[i].modCount) {
// force retry
check = -1;
break;
}
}
}
if (check == sum) {
break;
}
}
if (check != sum) {
// Resort to locking all segments
sum = 0;
for (final Segment<K, V> segment : segments) {
segment.lock();
}
for (final Segment<K, V> segment : segments) {
sum += segment.count;
}
for (final Segment<K, V> segment : segments) {
segment.unlock();
}
}
return sum > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) sum;
}