使用高性能的线程安全的set

前提在websockert中:

  • Collections.synchronizedSet(new HashSet<>()): 可以使用 Collections.synchronizedSet() 方法将一个普通的 HashSet 包装成一个线程安全的 Set。 但是,这种方式的并发性能通常不如 ConcurrentHashMap.newKeySet(),因为它使用了一个全局锁,导致所有线程必须串行访问 Set
  • CopyOnWriteArraySetCopyOnWriteArraySet 也是一个线程安全的 Set 实现。 它的特点是在修改 Set 时,会创建一个新的数组,并将所有元素复制到新的数组中。 这种方式适用于读多写少的场景,但在 WebSocket 服务器中,连接的添加和删除操作比较频繁,因此 CopyOnWriteArraySet 的性能可能不如 ConcurrentHashMap.newKeySet()

最好的方案:

Set<WebSocketSamplingServer> webSocketSet = ConcurrentHashMap.newKeySet();

  • ConcurrentHashMapConcurrentHashMap 是 Java 并发包 (java.util.concurrent) 中的一个类,它提供了一个线程安全的哈希表实现。 与普通的 HashMap 相比,ConcurrentHashMap 在多线程环境下具有更好的性能,因为它使用了锁分段技术,允许多个线程同时访问不同的数据段。
  • newKeySet()ConcurrentHashMap 类的一个静态方法,用于创建一个基于 ConcurrentHashMap 的线程安全的 Set。 这个 Set 实际上是一个 ConcurrentHashMap,但只使用键的部分,值的部分被忽略(或者说,值都是相同的,例如 Boolean.TRUE)。 这样做的好处是,你可以利用 ConcurrentHashMap 的线程安全性和高性能,同时又可以像使用 Set 一样方便地添加、删除和检查元素。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值