Current并发包(二) - CurrentMap

ConcurrentMap - 并发映射


ConcurrentMap

本质上是一个Map

提供了并发并安全的方式来读写数据

ConcurrentHashMap

红黑树
红黑树的本质

红黑树本质是一棵自平衡的二叉树

二叉查找树的特点

左子树小于根,右子树大于根

在JDK1.8中,为了提高增删效率,ConcurrentHashMap引入了红黑树机制

当桶中的元素个数超过8个的时候,桶中的链表会扭转成一棵红黑树

如果红黑树的节点个数不足7个,那么红黑树会扭转成链表

ConcurrentHashMap中树化的条件是桶的个数 >= 64个

红黑树的特点

所有的节点的颜色非红即黑

根节点必须是黑节点

红节点的子节点必须是黑节点,但是反之不成立

最底层的叶子节点必须是黑的空节点

从根节点到任意一个叶子节点途经的黑节点个数必须一致,即黑节点高度一致

/新添节点的颜色一定是红色

红黑树的修正 

涂色:

父节点为红色,并且叔父节点为红,那么需要将父节点以及叔父节点涂黑,然后将祖父节点涂红

左旋:

父节点为红,叔父节点为黑,并且当前节点为右子叶,那么需要以当前节点为轴左旋

右旋:

父节点为红,叔父节点为黑,并且当前节点为左子叶,那么需要以父节点为轴右旋

红黑树的时间复杂度是O(logN)

 

ConcurrentNavigableMap -并发导航映射

1.这个映射中提供了截取子映射的方法 --- headMap/ ailMap/subMap

2.ConcurrentNavigableMap本生是一个接口所以通常使用它的实现类ConcurrentSkipListMap ---并发跳跃表映射 - 底层基于跳跃来实现的

跳跃表

跳跃表要求元素必须有序

跳跃表可以形成多层,但是最上面的跳跃表中元素个数至少要两个

跳跃表适合于查询多的场景

跳跃表本省是一个典型的以空间换时间的产物

在跳跃表中如果是新增节点,这个节点是否要提取到跳跃表中,遵循抛硬币原则

跳跃表的空间复杂度是O(logN)

ConcurrentNavigableMapDemo.java
package com.wiscom.map;
​
public class ConcurrentNavigableMapDemo {
​
    public static void main(String[] args) {
​
        // 创建映射
        ConcurrentNavigableMap<String, Integer> map = new ConcurrentSkipListMap<>();
​
        // 添加元素
        map.put("g", 3);
        map.put("a", 6);
        map.put("s", 7);
        map.put("y", 0);
        map.put("e", 5);
        map.put("w", 8);
​
        System.out.println(map);
​
        // 截取子映射
        // 从头开始截取到指定的位置
        System.out.println(map.headMap("e"));
        // 从指定位置开始截取到尾部
        System.out.println(map.tailMap("e"));
        // 从指定位置开始截取到指定位置
        System.out.println(map.subMap("e", "w"));
    }
​
}
posted @ 2020-08-25 14:26  minnersun  阅读(646)  评论(0编辑  收藏  举报