ConcurrentHashMap 中的列表

GPP*_*oft 5 java multithreading synchronization concurrenthashmap

public static ConcurrentHashMap<Integer,Session> USER_SESSIONS...    
Run Code Online (Sandbox Code Playgroud)

一切正常。但是如果允许系统授权两个具有相同用户 ID 的会话呢?嗯,这大约是两台 PC 位于同一帐户下,但会话不同。试图这样做:

ConcurrentHashMap<Integer,List<Session>> USER_SESSIONS....

...............

private void addUser(Session session){
   List<Session> userSessions = Server.USER_SESSIONS.get(session.mUserId);

   if(userSessions==null){
       userSessions = new List<Session>();
       userSessions.add(session);
       Server.USER_SESSIONS.put(session.getUserId(),userSessions);
   }else{
       userSessions.add(session);
   }
}

private void removeUser(Session session){
  List<Session> userSessions = Server.USER_SESSIONS.get(session.mUserId);

  if(userSessions!=null){
       userSessions.remove(session);
       if(userSessions.size()==0)
       {
           Server.USER_SESSIONS.remove(session.getUserId());
       }
  }
}

.................

private void workWithUsers(int userId){
    for(Session session : Server.USER_SESSIONS.get(userId))
    {
       <do it!>
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,所有这些方法都可以从不同的线程调用,并且我收到了与 List 相关的错误。这是很自然的,因为虽然我有 foreach-list 会话可以通过 removeUser 从另一个线程中删除。该怎么办?如何使之--在工作中使用一个List 等待所有线程List 占用的线程用完呢?然而这样做了:)

public static ConcurrentHashMap<Integer,ConcurrentHashMap<Session,Session>> USER_SESSIONS
Run Code Online (Sandbox Code Playgroud)

由于 ConcurrentHashMap 线程安全。但我认为这是一个错误的决定。非常感谢您的帮助!

PS:JRE 1. 6

请原谅我的英语。

Ale*_*lex 0

您可以尝试在您的情况下使用CopyOnWriteArrayListCopyOnWriteArraySet