java中的锁——分段锁
ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构, 一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素, 每个Segment守护者一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。
java.util.concurrent提供了工具类:
- Map:ConcurrentHashMap、ConcurrentSkipListMap
- Collection:ConcurrentSkipListSet、CopyOnWriteArrayList 和CopyOnWriteArraySet。
- 当期望许多线程访问一个给定collection 时,使用ConcurrentHashMap替代HashMap
- 当期望许多线程访问一个给定collection 时,使用ConcurrentSkipListMap替代TreeMap
- ConcurrentSkipListSet(在JavaSE 6新增的)提供的功能类似于TreeSet,能够并发的访问有序的set。因为ConcurrentSkipListSet是基于“跳跃列表(skip list)”实现的,只要多个线程没有同时修改集合的同一个部分,那么在正常读、写集合的操作中不会出现竞争现象
- 当期望的读数和遍历远远大于列表的更新数时,使用CopyOnWriteArrayList 替代ArrayList。
- 当期望的读数和遍历远远大于列表的更新数时,使用CopyOnWriteArraySet替代HashSet。
————>>ConcurrentHashMap分段锁机制
————>>ConcurrentHashMap分段锁代替HashTable的独占锁
ConcurrentHashMap将一个Map分成16端Segment
又将每一个Segment分成16端(hash表的长度也默认16)