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
请原谅我的英语。
| 归档时间: |
|
| 查看次数: |
5034 次 |
| 最近记录: |