首先ConcurrentHashMap不允许key和value为null。
ConcurrentHashMap之所以可以做到高并发是因为ConcurrentHashMap内部分成了多个segment(类似于子map),只会对segment加锁,并不会整个ConcurrentHashMap 加锁。CONCURRENCY_LEVEL默认分成16个segment。可以在构造函数中指定大小。大致逻辑如下,以put为例说明。
根据hash值 算出key所在的segment(return segments [(hash >>> segmentShift) & segmentMask],其中segmentShift =log2(CONCURRENCY_LEVEL))。获得的segment类似于一个hashMap。然后在算出segment中key的位置(int index = hash & ( tab. length - 1);)。
性能分析:最好能够初始化时估算好ConcurrentHashMap的大小,如果一开始设置容量太小,后续容易频发发生rehash,影响性能。