Java之并发安全的集合

1. Hashtable

  • 键和值不能为空
  • 初始容量为11,每次扩容的容量是上一次容量的二倍再加一
  • 扩容后原先的元素不需要额外的二次hash
  • 锁住整张表

2. ConcurrentHashMap

2.1 Java1.7版本中

  • 由segment数组,hashEntry数组和链表组成。
  • segment数组大小也代表了并发数量。而且segment的数组大小初始化后就不能更改。
  • 一开始就初始化segment数组和segment[0]里面的HashEntry数组。其他的HashEntry数组懒惰初始化
    • segment[i](i>0)里面的HashEntry数组是懒惰初始化,当使用到的时候才会初始化。
    • segment[i](i>0)里面的HashEntry数组初始化时按照segment[0]里面的HashEntry数组的规模创建。
  • 扩容是按照segment里面的HashEntry数组为基本单位进行扩容。而不是所有的segment里面的HashEntry数组都要扩容
  • 假设ConcurrentHashMap中有16个segment,每个segment里的hashEntry数组大小也恰好都是32。
    • 对于一个key,它的hash值的最高4位用来定位segment,hash值得最低5位用来定位segment中的HashEntry数组下标。

2.2 Java1.8版本中

  • 由Node数组和链表或红黑树实现。  
  • Node数组是懒惰初始化
  • 初始容量16。Java8中是容量满3/4就会扩容。java1.7中是容量超过3/4才会扩容
  • 构造函数的参数
    • initialCapacity:表示你准备存放多少键值对的个数。它会根据这个值来动态初始化Node数组大小。实际初始化大小为initialCapacity/loadFactor再向上取2的幂。
    • loadFactor:初始化时负载因子,后面扩容的负载因子还是0.75。
  • 扩容的时候是原先node数组节点的移动是倒序移动。移动完毕的数组节点被替换为ForwardingNode节点。表明这里已经处理完毕。
    • 如果数组中链表节点个数为一,则将这个节点迁移到新的数组中去
    • 如果数组中链表节点个数比较长,则扩容的时候是复制这个链表所有节点。

  • 支持并发扩容,一个线程一次迁移16个数组节点,若还没迁移完就再一次迁移。

Java并发线程安全集合是指在多线程环境下能够保证数据一致性和线程安全的数据结构。Java提供了许多高并发线程安全集合,包括ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList、CopyOnWriteArraySet等。 ConcurrentHashMap是一个线程安全的哈希表,它允许多个线程同时读取并修改其中的元素。它使用分段锁的方式来实现并发访问,不同的线程可以同时访问不同的分段,从而提高了并发性能。 ConcurrentSkipListMap是一个基于跳表的并发有序映射,它可以提供较好的并发性能,且支持按照键的顺序进行遍历。它的实现是通过通过多层链表实现的,每一层链表中的节点按照键的顺序排列。 ConcurrentSkipListSet是一个基于ConcurrentSkipListMap的并发有序集合,它实现了Set接口,并且保证元素的有序性和线程安全性。 CopyOnWriteArrayList是一个线程安全的ArrayList,它通过每次修改时创建一个新的副本来实现线程安全。虽然在插入和删除操作时需要复制整个数组,但读取操作非常高效,适用于读操作远多于写操作的场景。 CopyOnWriteArraySet是一个线程安全的Set,它是基于CopyOnWriteArrayList实现的。它通过复制整个数组来实现线程安全,保证了元素的唯一性和线程安全。 这些高并发线程安全集合在多线程环境中保证了数据的一致性和线程安全性,能够提高并发性能和效率,适用于高度并发和需要频繁读写的场景。但需要注意的是,并发集合在某些操作上可能会损失一些性能,因此在选择使用时需根据具体需求进行权衡和选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值