ConcurrentMap:并发映射
HashMap
` 基于hash表进行存储的映射。异步式线程不安全的映射—没有同步锁机制,多个线程访问的时候会有数据不明确的问题。
` 虽然不安全,但是效率高。
` 底层以数组+链表结构存储。
` 底层数组初始大小:16
HashTable
` 同步式线程安全的映射。对外提供的方法大部分都是同步方法。如果同步方法是非静态,那么锁对象是this;如果同步方法是静态方法,那么锁对象是当前类的字节码。所以HashTable使用时是将整个映射进行锁定,意思就是只要有一个线程成功操作hashtable,那么这么线程就锁定hashtable,其他的线程就不能锁定了。
` 保证同步,保证线程安全,但是因为锁定的是整个映射,所以效率不高。比如多个线程都是.get()读操作,效率很低。
` 底层以数组+链表结构存储。
` 底层数组初始大小:11
ConcurrentHashMap
` 异步式线程安全的映射。JDK1.5开始,采取了分段锁/分桶锁。问题:程序时间空间开销大,锁需要上下文切换,线程调度等问题。所以从JDK1.8开始,采取CAS算法+红黑树结构,进行存储和保证效率。
` 底层以数组+链表结构存储。数组中的每个位置称为桶buckets,每个桶中维系一个链表,链表中的每个节点存储键、值、上个节点的地址、下个节点的地址。
` 底层数组初始大小:16