Java并发包之ConcurrentMap浅析

本文深入探讨了Java并发包中的ConcurrentMap,特别是其核心实现类ConcurrentHashMap。ConcurrentHashMap在JDK 1.5采用分段锁,而JDK 1.8则使用CAS无锁算法和红黑树,以提升并发性能。在JDK 1.8中,当元素超过8个时,链表会转换为红黑树,以优化查找效率。此外,还介绍了ConcurrentNavigableMap接口及其实现类ConcurrentSkipListMap,该实现基于跳跃表,提供高效的并发导航功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ConcurrentMap(并发映射)

       1.继承了Map接口

ConcurrentHashMap

       1.底层基于数组+链表的结构。数组初始容量位16,加载因子为0.75,是一个异步式线程安全的映射。JDK1.5中,采取了分段锁机制,后续引入读写锁优化。对于写锁:只允许一个线程写,写的时候不允许线程读,防止产生脏数据;对于读锁:允许多个线程读,不允许写。读的效率增加,写的效率变化不大。JDK 1.8中,采用了CAS无锁算法,不用锁可以减少系统资源的开销。(CAS3个操作数,内存值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.跳跃表:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值