ユーザーが接続し、名前を変更し、部屋に移動してチャットできるようにする単純なクライアント サーバー プログラムを作成しています。サーバーは、アクティブでない場合は各クライアントに定期的にハートビート信号を送信し、クライアントが応答しない場合はクライアントを削除します。
サーバーのクリーンアップをさらに強化するために、ルームが空かどうかも定期的に確認しています。空の場合は、サーバーからルームを削除して、不要なデータが蓄積されるのを防ぎます。ただし、この削除は問題を引き起こします。ルーム名をプレイヤー名とそのソケットを保持する ConcurrentHashMap にマップする ConcurrentHashMap を使用しています。次に、定期的にすべての部屋をループし、そこにプレーヤー (サイズが 0 より大きい) が含まれているかどうかを確認します。そうでない場合は、部屋を削除します。
ただし、サーバーがクリーンアップを決定したときに、ユーザーが空の部屋に参加する正確な瞬間を選択すると、これは非常に問題のある状況を示します. ConcurrentHashMap はすべての内部同期を処理するため、削除が 100% スレッド セーフになるように、この特定の状況を同期することはできません。ルームが削除されているときに、ユーザーがルームに参加する可能性があります。
この問題を解決するにはどうすればよいですか?