简介
HashMap、Hashtable、ConcurrentHashMap都是一个数组链表结构。但是HashMap是线程不安全的。Hashtable和Collections.synchronizedMap(hashMap)是线程安全,但是是锁整个结构的,性能很差。ConcurrentHashMap是线程安全,锁的力度小,性能更好。
ConcurrentHashMap如何保证线程安全和高性能
如果指定initialCapacity,会自动扩充到最接近的2的n次方,目的是在hash定位时可以用与操作替代取模操作,提升性能。(假设数据大小为n,即用hash&(n-1)替代hash%n)
降低锁的力度:通过concurrencyLevel可以指定Segment[]的大小(ReentrantLock),默认是16,增大它可以获得更好的并发性能。先通过hash定位段,再定位在段中的位置
V定义成volatile,这样保证V在修改后对其他线程立即可见.
next定义为final,这样next在初始化后不可修改,在编译时就保证next不会被修改。降低执行读操作的线程在遍历链表期间对加锁的需求。但这样也使得add和remove操作更加复杂,不能像上面HashMap直接修改next,而是重新构建。
在计算size()失败后,会锁定全部段,所以尽量少调用size()方法