关于ConcurrentHashMap的初步认识
根据码码在线老哥们面试情况来看,ConcurrentHashMap是面试中必考的知识点,所以在此对它进行些许了解,以便实习面试时不会太难堪。
ConcurrentHashMap,这个东西是1.5以后出现的,在java.util.concurrent包下的.先了解HashMap,HashTable,Synchronized,Lock等技术点后我们才能进一步学习ConcurrentHashMap。
HashMap的数据结构是Node[]数组 + 链表结构.对应的有HashTable,一定程度上等同于HashMap.HashMap和HashTable都实现了Map接口.HashMap因为不是同步的,所以会有线程安全问题,而HashTable是同步的所以线程安全.当然的,在单线程操作下,HashMap的效率比HashTable要高.
HashTable是通过Synchroinzed来保证线程安全,副作用是一次只能有一个线程去修改HashTable,必须先获得其同步锁才能进行修改,其他线程必须等待锁被释放之后才能获得执行权去修改HashTable.所以一般在多线程情况下,hashtable并不是最优选择。1.5以后出现的ConcurrentHashMap,解决了HashTabe安全但效率低,HashMap效率高但不能保证线程安全的毛病。
Lock,这个类实现了Lock接口是1.5以后出现的一种锁,相比较Synchronized这种同步锁而言ReentrantLock更加灵活.Synchronized是互斥的,而ReentrantLock作用类似于Synchronized,但是不用和Synchronized一样在获取锁的时候必须等待,可以设置轮询,定时,中断,在多个锁的情况下可以避免死锁.
ConcurrentHashMap, 一个Segment[]数组上挂了一堆HashEntry,而HashEntry的数据结构也是K->V结构,HashEntry中有entries[]数组,数组的index对应的是链表结构. Segment[]t是ConcurrentHashMap中维护的一个静态内部类。
大致数据结构如图所示
初步认识到这里,但应对面试还远远不够,后面还有get set等源码就等以后慢慢研究了。