ConcurrentHashMap.sizeCtl vs HashMap.threshold, single-threaded, read by reflection =================================================================================== new ConcurrentHashMap() sizeCtl=0 table=null after 1st put sizeCtl=12 table.length=16 after 12 puts (size=12) sizeCtl=24 table.length=32 baseCount=12 counterCells=null size()=12 mappingCount()=12 (single thread: no CounterCell was ever needed) Sizing constructors: ask for 32 and see what each map really allocates new ConcurrentHashMap(32) sizeCtl=64 (table not allocated yet) after 1st put sizeCtl=48 table.length=64 new HashMap(32) threshold=32 table=null (threshold holds the initial capacity until first put) after 1st put threshold=24 table.length=32 What sizeCtl holds while a resize is running (computed, not caught live): resizeStamp(16)=32795 (rs << 16) + 2 = -2145714174 -> negative, so every other thread sees 'resize in progress'