我试图按照以下方式在Java中创建线程安全的数据结构:
public class A {
ConcurrentHashMap<String, Set<String>> subscriptions
private void addSubscription(String server, String client) {
Set<String> clients = subscriptions.get(server);
if (clients == null) {
clients = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
subscriptions.put(server, agents);
}
clients.add(client);
}
private synchronized void removeSubscription(String server, String client) {
Set<String> clients = subscriptions.get(server);
if (clients != null) {
clients.remove(client);
if (clients.isEmpty()) {
subscriptions.remove(server, agents);
}
}
}
}
但是,看来我需要添加其他同步(我猜是为了保护对Set的访问)。这里是否有更好的集合可以使用,还是只需要为此添加适当的同步?
是什么使您认为您需要其他同步?我不知道为什么会这样。我要更改的一件事是,addSubscription
应检查给定服务器的设置是否不存在,并自动添加它。这样,当两个线程将客户端添加到同一服务器时,可以避免争用情况:
Set<String> newClients = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
Set<String> clients = subscriptions.putIfAbsent(server, newClients);
if(clients == null) clients = newClients;
clients.add(client);
另外,在设置为空后,我不会从地图中删除该设置。否则,会出现另一种竞争状况:在您检查了大小并发现它为空之后,可能有人添加了一个新客户端,然后您将其丢弃。只是让空集呆在那里,那没有什么害处。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句