上一篇叙述的常用集合类里只有Vector和HashTable是老版本线程安全的,也就是高并发的容器,本篇介绍更高效的集合—>ConcurrentHashMap.
大家知道一般情况下要保证线程安全的话,需要给集合加锁,也就是synchronized,老版本的Vector和HashTable就是给整个集合加锁。
HashTable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。
本文的ConcurrentHashMap不是给整个集合加锁,而是把集合分为16个segment,每个segment就相当于一个HashTable。从而提高大大的提高高并发情况下的效率。
在java1.8之后,又淘汰了segement的使用,改为了Node的形式,有兴趣的可以自己度娘一下。