ConcurrentMap(并发映射)
1.继承了Map接口
ConcurrentHashMap
1.底层基于数组+链表的结构。数组初始容量位16,加载因子为0.75,是一个异步式线程安全的映射。JDK1.5中,采取了分段锁机制,后续引入读写锁优化。对于写锁:只允许一个线程写,写的时候不允许线程读,防止产生脏数据;对于读锁:允许多个线程读,不允许写。读的效率增加,写的效率变化不大。JDK 1.8中,采用了CAS无锁算法,不用锁可以减少系统资源的开销。(CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时(根据v找到值得地址),将内存值V修改为B,否则什么都不做。)
2.在JDK 1.8中,为了提高增删查询效率,引入了红黑树机制。如果某个桶中的元素超过了8个,那么这个时候这个桶中的元素就会扭转成一棵红黑树;如不足7个,那么会扭转回链表。
3.红黑树
a.是一棵自平衡二叉查找树。(插入时不会出现”瘸腿”现象,二叉查找树特点左比跟小,右比根大)
b.特征: 根节点为黑;
所有节点非黑即红;
红节点下一定是黑;
最下层的叶子节点一定是黑;
插入节点的颜色一定是红节点;
任意根节点到叶子节点路径上的黑色节点相等;
c.修正:
i. 当前节点为红,父节点和叔节点为红--父节点和叔节点变黑(变色)
ii. 当前节点为红,父节点为红,叔节点为黑,且当前节点为右子叶节点,那么以当前节点为基准进行-左旋
iii. 当前节点为红,父节点为红,叔节点为黑,且当前节点为左子叶节点,那么以当前节点为基准进行-右旋(可以单独右旋)
d.时间复杂度O(logn)—算法思想基于折半查找
ConcurrentNavigableMap 并发导航映射
1.本身是一个接口
2.常用实现类ConcurrentSkipListMap,基于跳跃表实现
3.跳跃表: