文章目录
- 线程安全方面
- 性能方面
- 总结
线程安全方面
HashMap线程不安全,HashMap的方法没有进行同步,多个线程同时访问HashMap,并至少有一个线程修改了其内容,则必须手动同步。
HashTable是线程安全的,在HashMap的基础上对其方法都加上了synchronized使其同步
ConcurrentHashMap是线程安全的,并不是对整个HasMap进行加锁,它使用了一种更细粒度的锁机制(分锁或CAS操作)
Java 7及之前版本
分段锁(Segment)机制:
将整个哈希表分成多个段(Segment)
每个段相当于一个独立的哈希表
不同段可以并发操作,相同段才需要竞争锁
Java 8及之后版本
改进为CAS+synchronized:废弃分段锁设计
使用Node数组+链表/红黑树结构
对单个桶(bucket)加锁(synchronized)
大量使用CAS(Compare-And-Swap)无锁算法
性能方面
Hashtable: 由于所有方法都是同步的,因此在多线程环境下性能较差。
HashMap: 在单线程环境下性能最好,因为它没有同步开销。
ConcurrentHashMap: 在多线程环境下性能优于Hashtable,因为它使用了更高效的并发控制机制。