java – 在ConcurrentHashMap中列出

public static ConcurrentHashMap<Integer,Session> USER_SESSIONS...    

一切正常.但是如果允许系统被授权两个具有相同用户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!>
    }
}

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

public static ConcurrentHashMap<Integer,ConcurrentHashMap<Session,Session>> USER_SESSIONS

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

P.S:JRE 1.6

抱歉我的英语.

最佳答案 您可以使用List myList = Collections.synchronizedList(new ArrayList< String>());如果您不想使用CopyOnWriteArrayList.

您唯一需要记住的是,必须同步代码,您将在列表上进行迭代.你可以在这里看到更多信息:Collections.synchronizedList and synchronized

点赞