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