【发布时间】:2019-07-08 04:34:33
【问题描述】:
我遇到了以下代码,并指出了一些不一致之处 - 用于多线程安全代码。
Map<String,Map<String,Set<String>> clusters = new HashMap<.........>;
Map<String,Set<String>> servers = clusters.get(clusterkey);
if(servers==null){
synchronized(clusterkey){
servers = clusters.get(clusterkey);
if(servers==null){....initialize new hashmap and put...}
}
}
Set<String> users=servers.get(serverkey);
if(users==null){
synchronized(serverkey){
users=servers.get(serverkey);
if(users==null){ ... initialize new hashset and put...}
}
}
users.add(userid);
- 为什么地图会在 clusterkey 上同步——它不应该作为监视器本身在地图上吗?
- 最后一个 users.add... 是否也应该同步?
- 要以线程安全的方式添加单个用户,这似乎需要很多代码。什么是更智能的实现方式?
【问题讨论】:
-
在我们知道确切的上下文之前,没有对错之分。您提供的代码 sn-p 不足以告诉我们最初的实现者在想什么。
标签: java hashmap synchronized