java创建线程安全的Set集合

CopyOnWriteArraySet

CopyOnWriteArraySet<String> copyOnWriteArraySet = new CopyOnWriteArraySet<>();
原理

和CopyOnWriteArrayList实现原理一样,采用读写分离的并发策略,读操作的时候不加锁,写操作时创建底层数据的新副本,在新副本上执行写操作,写操作结束后将原引用指向新的容器。适合读多写少的场景。

特点
  • 读操作性能高
  • 当使用迭代器遍历时,在遍历的间隔中如果修改了集合,不会抛出ConcurrentModificationException异常。
  • 由于要复制新副本,会占用较大内存
  • 写操作时在新的副本上操作,此时的读操作还是在旧副本上,所以无法保证实时性
  • 大量写操作性能很差

Collections.synchronizedSet()

HashSet<String> hashSet = new HashSet<>();
Set<String> synchronizedSet = Collections.synchronizedSet(hashSet);
原理

在原先Set的每一个方法上都加上synchronized关键字

特点
  • 性能较差
  • 遍历间隔中如果修改了集合,仍会抛出异常ConcurrentModificationExceptions

Collections.newSetFromMap()

Set<String> setFromMap = Collections.newSetFromMap(new ConcurrentHashMap<>());
原理

封装了ConcurrentHashMap,利用ConcurrentHashMap的性质确保生成的Set是线程安全的。

特点
  • 该方法必须传入一个空的map
  • 性能较好,ConcurrentHashMap是分区的,写操作时对应的分区时是synchronized的,读操作与其他读操作、写操作是完全并发的(但可能没法看到当前正在写入的更改的结果)
  • 迭代器创建后可能会看到变化,也可能看不到变化,而且批量操作不是原子操作
  • reSize操作较慢,因此在初始化时最好能够指定大小(3/4满时就会reSize)
  • 需要hashCode()方法有较好的性能
  • 不允许再和传入的map做交互

ConcurrentHashMap.newKeySet()

ConcurrentHashMap.KeySetView<String, Boolean> keySetView = ConcurrentHashMap.newKeySet();
原理

jdk1.8以后引入的特性,是ConcurrentHashMap的特性的一部分

特点
  • 与上面提到的Collections.newSetFromMap(new ConcurrentHashMap<>())相似
  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值