如何在 ConcurrentHashMap 中并发放置一个没有锁定的元素(可能存在)?

how to concurrently put an element (might exist) without lock in ConcurrentHashMap?

我正在编写一个简单的消息队列程序,我有多个生产者多个序列化器(现在不考虑消费者) .生产者使用 String queueName 指定要将消息发送到哪个队列。并且序列化程序 只能在发送过程 期间初始化,因为直到 运行 才知道确切的 number/name 队列。由于我必须使用地图,我想我可以使用

我想避免使用显式锁,所以我选择了ConcurrentHashMap。但是,使用 ConcurrentHashMap 并不意味着我的程序 ConcurrentHashMap 是线程安全的,containsKey()put() 之间的空闲可能会导致一些混乱。所以我考虑使用它的putIfAbsent()方法。

但是,当我调用 putIfAbsent(queuename, new MySerializer()) 时,我发现每次调用 putIfAbsent 时它都会创建一个 MySerializer 的新实例。但如果我不使用 putIfAbsent,我将不得不使用类似锁的东西。

我的问题是如何在避免同时使用锁的情况下将元素并发添加到 ConcurrentHashMap 中?

Java 8 添加了新方法到 Map 接口,允许延迟计算潜在的新值。例如:

map.computeIfAbsent(queuename, MySerializer::new);