前提在websockert中:
Collections.synchronizedSet(new HashSet<>()): 可以使用Collections.synchronizedSet()方法将一个普通的HashSet包装成一个线程安全的Set。 但是,这种方式的并发性能通常不如ConcurrentHashMap.newKeySet(),因为它使用了一个全局锁,导致所有线程必须串行访问Set。CopyOnWriteArraySet:CopyOnWriteArraySet也是一个线程安全的Set实现。 它的特点是在修改Set时,会创建一个新的数组,并将所有元素复制到新的数组中。 这种方式适用于读多写少的场景,但在 WebSocket 服务器中,连接的添加和删除操作比较频繁,因此CopyOnWriteArraySet的性能可能不如ConcurrentHashMap.newKeySet()
最好的方案:
Set<WebSocketSamplingServer> webSocketSet = ConcurrentHashMap.newKeySet();
ConcurrentHashMap:ConcurrentHashMap是 Java 并发包 (java.util.concurrent) 中的一个类,它提供了一个线程安全的哈希表实现。 与普通的HashMap相比,ConcurrentHashMap在多线程环境下具有更好的性能,因为它使用了锁分段技术,允许多个线程同时访问不同的数据段。newKeySet():ConcurrentHashMap类的一个静态方法,用于创建一个基于ConcurrentHashMap的线程安全的Set。 这个Set实际上是一个ConcurrentHashMap,但只使用键的部分,值的部分被忽略(或者说,值都是相同的,例如Boolean.TRUE)。 这样做的好处是,你可以利用ConcurrentHashMap的线程安全性和高性能,同时又可以像使用Set一样方便地添加、删除和检查元素。
10万+

被折叠的 条评论
为什么被折叠?



