Java中的同步嵌套集合

特巴赫曼

我试图按照以下方式在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Java中Firebase的数据中存在嵌套集合的类中存储数据集合?

来自分类Dev

在嵌套集合模型Java / MySQL中复制子树

来自分类Dev

Java 8集合-过滤嵌套列表中的值

来自分类Dev

如何使用java中的集合创建嵌套的json

来自分类Dev

Hazelcast IMap中的嵌套集合

来自分类Dev

反转LINQ中的嵌套集合

来自分类Dev

删除嵌套集合中的实体

来自分类Dev

反转LINQ中的嵌套集合

来自分类Dev

在Java中的实例同步

来自分类Dev

在Java中同步对象

来自分类Dev

Java中的对象同步

来自分类Dev

同步angular2中的嵌套订阅

来自分类Dev

Java中的同步方法和同步块

来自分类Dev

Java中的同步和同步块

来自分类Dev

在Java中,“同步”是否等效于“同步(this)”?

来自分类Dev

处理嵌套集合与Java 8流

来自分类Dev

如何将嵌套的Java集合中的所有项目展平为单个List?

来自分类Dev

Sonata Admin(2.3)中的嵌套集合字段

来自分类Dev

python嵌套字典:集合中的OrderedDict

来自分类Dev

LINQ检查嵌套集合中的重复项

来自分类Dev

如何在Spark中读取嵌套集合

来自分类Dev

js中的嵌套模型和集合

来自分类Dev

更新MongoDB集合文档中的嵌套键值

来自分类Dev

LINQ检查嵌套集合中的重复项

来自分类Dev

将项目推入AngularJS的嵌套集合中

来自分类Dev

使用 LINQ 在嵌套集合中查找值

来自分类Dev

优化 mongoDb 中的嵌套集合调用

来自分类Dev

在C#中同步共享资源的集合

来自分类Dev

在C#中同步共享资源的集合