并发度可以理解为程序运行时能够同时更新ConccurentHashMap且不产生锁竞争的最大线程 数,实际上就是ConcurrentHashMap中的分段锁个数,即Segment[]的数组长度。
ConcurrentHashMap默认的并发度为16,但用户也可以在构造函数中设置并发度。当用户设置 并发度时,ConcurrentHashMap会使用大于等于该值的最小2幕指数作为实际并发度(假如用 户设置并发度为17,实际并发度则为32) 。
运行时通过将key的高n位(n = 32 – segmentshift)和并发度减1 (segmentMask)做位 与运算定位到所在的Segmento segmentShift与segmentMask都是在构造过程中根据 concurrency level被相应的计算出来。
如果并发度设置的过小,会带来严重的锁竞争问题;如果并发度设置的过大,原本位于同一个 Segment内的访问会扩散到不同的Segment中,CPU cache命中率会下降,从而引起程序性能 下降。(文档的说法是根据你并发的线程数量决定,太多会导性能降低)
Was this helpful?
0 / 0