ConcurrentHashMap
Segment段
ConcurrentHashMap和HashMap思路差不多的,但是因为他支持并发操作,所以要复杂一些,整个ConcurrentHashMap由一个个Segment组成,Segment代表“部分” 或者“一段”的意思,所以很多地方都会将其描述为 分段锁。
线程安全(Segment继承ReentrantLock加锁)
简单理解就是,ConcurrentHashMap是一个segment数组,segment通过继承ReentrantLock来进行加锁,所以每次需要加锁的操作锁住的是一个segment,这样只要保证每个segment是线程安全的,也就实现了全局的线程安全。
并行度(默认16)
concurrentLevel:并行级别,并发数,segment数。默认16.
也就是说ConcurrentHashMap有16个Segment,所以理论上,这个时候,最多可以同时支持16个线程并发写,只要他们的操作分别分布在不同的segment上,这个值可以在初始化的时候设置为其他值,但是一旦初始化后,它是不可以扩容的。再具体到每个segment内部,其实每个segment很像之前介绍的HashMap,不过它要保证线程安全,所以处理起来要麻烦些。
Java8 实现 (引入了红黑树)
Java8 对 ConcurrentHashMap 进行了比较大的改动,Java8 也引入了红黑树。
Hashtable(线程安全)
Hashtable是遗留类,很多映射的常用功能与HashMap类似,不同的是它继承自Dictinary类,
并且是线程安全的,任意时刻只有一个线程能写Hashtable,并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁。Hashtable不建议在新代码中使用,不需要线程安全的场合可以用HashMap替换,需要线程安全的场合使用ConcurrentHashMap替换。
需要线程安全的场合使用ConcurrentHashMap替换。