gpt4 book ai didi

java - 正确地从 ConcurrentHashMap 中删除值

转载 作者:行者123 更新时间:2023-11-30 06:25:59 26 4
gpt4 key购买 nike

我正在制作一个简单的客户端服务器程序,允许用户连接、更改他们的名字并进入房间聊天。如果客户端不活跃,服务器会定期向每个客户端发送心跳信号,如果客户端没有响应,则删除客户端。

为了进一步加强我的服务器清理,我还定期检查我的房间是否为空,在这种情况下,我会从服务器中删除房间以防止不必要的数据堆积。但是,此删除会产生一个问题。我正在使用 ConcurrentHashMap 将房间名称映射到包含玩家名称及其 socket 的 ConcurrentHashMap。然后,我定期循环遍历每个房间,检查它是否包含任何玩家(大小 > 0)。如果没有,我会移除房间。

但是,当用户选择在服务器决定清理空房间时加入空房间的确切时间时,这会出现一个非常有问题的情况。由于 ConcurrentHashMap 处理所有底层同步,我无法同步这种特定情况,因此删除是 100% 线程安全的。用户可能会在房间被移除时加入房间,这会导致他陷入困境。

我该如何解决这个问题?

最佳答案

我会将外部映射保留为 ConcurrentHashMap,但将内部映射替换为 ChatRoom 类。单个房间的预期 Activity 率似乎并不能证明如此强大的并发 map 是合理的。

ChatRoom 类应该是线程安全的,并且它应该有一个“关闭”标志,指示房间是否已关闭。 close() 方法应该使用房间的锁来更改标志,并使任何后续操作都是非法的。实际上 close 方法应该返回一个 boolean 值,表示房间是否已经关闭;当且仅当房间是空的时,它才应该关闭。

您的空闲房间检查器线程应调用 room.close(),然后将其从外部 map 中移除。

关于java - 正确地从 ConcurrentHashMap 中删除值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14943531/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com