gpt4 book ai didi

java - Java中的同步嵌套集合

转载 作者:行者123 更新时间:2023-12-03 13:12:24 26 4
gpt4 key购买 nike

我试图按照以下方式在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);

另外,在设置为空后,我不会从 map 中删除该设置。否则,会出现另一种竞争状况:在您检查了大小并发现它为空之后,可能有人添加了一个新客户端,然后您将其丢弃。只是让空集呆在那里,那没有什么害处。

关于java - Java中的同步嵌套集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27810474/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com