/*** Number of unsynchronized retries in size and containsValue* methods before resorting to locking. This is used to avoid* unbounded retries if tables undergo continuous modification* which would make it impossible to obtain an accurate result.*/ staticfinalint RETRIES_BEFORE_LOCK &#61;2;publicintsize(){// Try a few times to get accurate count. On failure due to// continuous async changes in table, resort to locking.final Segment<K,V>[] segments &#61;this.segments;int size;boolean overflow;// true if size overflows 32 bitslong sum;// sum of modCountslong last &#61;0L;// previous sumint retries &#61;-1;// first iteration isn&#39;t retrytry{for(;;){// 超过尝试次数&#xff0c;则对每个 Segment 加锁if(retries&#43;&#43;&#61;&#61; RETRIES_BEFORE_LOCK){for(int j &#61;0; j < segments.length;&#43;&#43;j)ensureSegment(j).lock();// force creation}sum &#61;0L;size &#61;0;overflow &#61;false;for(int j &#61;0; j < segments.length;&#43;&#43;j){Segment<K,V> seg &#61;segmentAt(segments, j);if(seg !&#61; null){sum &#43;&#61; seg.modCount;int c &#61; seg.count;if(c <0||(size &#43;&#61; c)<0)overflow &#61;true;}}// 连续两次得到的结果一致&#xff0c;则认为这个结果是正确的if(sum &#61;&#61; last)break;last &#61; sum;}}finally{if(retries > RETRIES_BEFORE_LOCK){for(int j &#61;0; j < segments.length;&#43;&#43;j)segmentAt(segments, j).unlock();}}return overflow ? Integer.MAX_VALUE : size; }