1、HashMap在多线程环境下是线程不安全的,HashTable、ConcurrentHashMap在多线程环境下是线程安全的。
2、在多线程环境下,HashTable和ConcurrentHashMap的锁粒度不同。HashTable的锁粒度更大,整个哈希表只有一把锁控制,而ConcurrentHashMap的锁粒度比较小,它的每一个链表有一把锁控制,这样的好处是当两个线程访问同一个对象时,访问到同一把锁的概率大大降低,发生锁冲突的概率大大降低。
3、ConcurrentHashMap采用了一个激进的优化方式,只对写操作进行加锁。当多个线程进行读操作时,不加锁;一个线程进行读操作时,另一个线程进行写操作时,不加锁,ConcurrentHashMap采用volatile关键字保证一边进行读操作一边进行写操作时,能够读到及时的数据。
4、ConcurrentHashMap采用CAS特性。其优化策略是尽一切可能降低锁冲突的概率。加锁有可能降低代码的性能。
5、ConcurrentHashMap对哈希表的扩容操作进行了特殊操作,其扩容并不是像顺序表那样申请一个更大的数组然后一次性将旧数组上的数据拷贝到新数组里。而是采用了“化整为零”的思想。一部分一部分的数据拷贝到新数组里,不是一次性全部拷贝到数组里。在这个拷贝的过程中,如果要进行查询元素操作,那么旧数据和新数据里的数据一块查询,如果要进行插入元素操作,直接在新数组上进行插入,如果要进行删除操作,直接在旧数组上进行操作。