我正在製作一個簡單的客戶端服務器程序,它允許用戶連接,更改其名稱並移入聊天室。如果服務器未處於活動狀態,服務器會週期性地向每個客戶端發送心跳信號,如果客戶端沒有響應,則會移除客戶端。從ConcurrentHashMap正確刪除值
爲了進一步加強我的服務器清理,我還定期檢查我的房間是否爲空,在這種情況下,我將服務器的空間從服務器上移除,以防止建立不必要的數據。但是,此刪除會產生問題。我使用ConcurrentHashMap將房間名稱映射到一個包含玩家名稱和套接字的ConcurrentHashMap。然後,我週期性地遍歷每個房間,檢查它是否包含任何玩家(大小> 0)。如果不是,我將房間移開。
但是,當服務器決定清理它時,當用戶選擇準確時刻加入空房間時,會出現非常有問題的情況。由於ConcurrentHashMap處理所有下面的同步,所以我無法同步這種特定情況,因此刪除是100%線程安全的。當房間被移走時,用戶可能會加入房間,這使得他陷入了僵局。
我該如何解決這個問題?
如果你第一次從地圖中刪除房間,然後檢查是否有任何用戶?如果有,則重新將房間添加到地圖。如果只是在地圖中有一個新房間,並且名稱相同,則會合並這兩個房間。 – Luciano 2013-02-18 19:07:28