【发布时间】:2013-12-23 06:27:57
【问题描述】:
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 线程安全。但我认为这是一个错误的决定。非常感谢您的帮助!
PS:JRE 1.6
请原谅我的英语。
【问题讨论】:
-
CopyInWriteArrayList 怎么样docs.oracle.com/javase/6/docs/api/java/util/concurrent/… 请参阅stackoverflow.com/questions/6916385/… 的讨论。基本上建议 ConcurrentHashMap
> USER_SESSIONS
标签: java multithreading synchronization concurrenthashmap