前言
HashMap是线程不安全的类,JDK1.8之前多线程的情况下,如果多次put操作会导致死循环,尽管JDK1.8对HashMap进行了优化,但是HashMap并不是为了线程安全而设计的类。因此多线程下我们应该尽量避免使用HashMap。
尽管Hashtable是线程安全的类,但是当Hashtable进行put操作时会将整个Hashtable对象锁起来,同一时刻只允许一个线程向Hashtable中put数据,多线程情况下使用Hashtable效率极低。
如果追求效率与线程安全,此时可以使用ConcurrentHashMap。ConcurrentHashMap是一个利用锁分段的技术的线程安全容器类,允许多个线程对ConcurrentHashMap同时进行写操作。ConcurrentHashMap之所以允许多个线程同时进行写操作,核心在于利用了锁分段的思想。
ps:代码来源于JDK1.8
正文
ConcurrentHashMap容器中拥有多个锁,每一把锁锁住部分数据,因此在多线程情况下,不同线程操作不同数据不会造成冲突,线程之间也不会存在锁竞争,有效的提高了并发访问效率。ConcurrentHashMap使用的锁分段技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。ConcurrentHashMap的结构使用的是数组+链表+红黑树。如果ConcurrentHashMap数组的长度是n,那么总共就会有n段数据,ConcurrentHashMap最多可以同时支持n个线程对容器进行操作。
对于ConcurrentHashMap的锁分段机制,举这样一个例子来帮助理解。假设现在有20个人,地面上