我正在制作一个简单的客户端服务器程序,它允许用户连接、更改他们的名字并进入房间聊天。如果客户端没有活动,服务器会定期向每个客户端发送心跳信号,如果客户端没有响应,则删除客户端。
为了进一步加强我的服务器清理,我还会定期检查我的房间是否是空的,在这种情况下,我会从服务器上删除房间以防止不必要的数据堆积。然而,这种移除会产生一个问题。我正在使用 ConcurrentHashMap 将房间名称映射到包含玩家名称及其套接字的 ConcurrentHashMap。然后,我周期性地遍历每个房间,检查它是否包含任何玩家(大小> 0)。如果没有,我删除房间。
但是,当服务器决定清理空房间时,当用户选择加入空房间的确切时间时,这会出现一个非常有问题的情况。由于 ConcurrentHashMap 处理所有底层同步,因此我无法同步这种特定情况,以便删除是 100% 线程安全的。用户可能会在房间被移除时加入房间,这会导致他陷入困境。
我该如何解决这个问题?