HashMap
HashMap是单线程环境下使用的哈希表,它是线程不安全的,在多线程环境下使用HashMap可能会出现线程安全的问题~
HashTable
HashTable使用了synchronized关键字来确保线程安全,但是HashTable的加锁方式是对于整个HashTable对象的加锁,也就是相当于对整个哈希表加锁,锁粒度非常粗,这样的话多个线程下,无论这些线程都是如何操作这个哈希表,都会产生锁冲突,效率会非常低下~
ConcurrentHashMap
ConcurrentHashMap是我们在多线程环境下推荐使用的一种线程安全的哈希桶结构,ConcurrentHashMap存在以下的几个优势:
1、锁粒度细化了,ConcurrentHashMap中的每个哈希桶都有自己的锁,大大降低了锁冲突的概率,性能也就大大提高了
2、ConcurrentHashMap的读操作不加锁,只给写操作加锁
3、ConcurrentHashMap充分利用了CAS的特性
4、ConcurrentHashMap对于扩容操作进行了特殊的优化(化整为零)
化整为零解释:ConcurrentHashMap扩容时会再开辟一块空间,把旧的数据一点一点搬运到新的里(每次只搬运一点),旧的和新的会同时存在一段时间,搬运结束后,释放旧的空间
5、HashMap中的key允许为null,HashTable和ConcurrentHashMap中key不允许为null