如何在 ConcurrentHashMap 中并发放置一个没有锁定的元素(可能存在)?
how to concurrently put an element (might exist) without lock in ConcurrentHashMap?
我正在编写一个简单的消息队列程序,我有多个生产者和多个序列化器(现在不考虑消费者) .生产者使用 String queueName
指定要将消息发送到哪个队列。并且序列化程序 只能在发送过程 期间初始化,因为直到 运行 才知道确切的 number/name 队列。由于我必须使用地图,我想我可以使用
- HashMap 与 lock/synchronized
- ConcurrentHashMap
我想避免使用显式锁,所以我选择了ConcurrentHashMap。但是,使用 ConcurrentHashMap
并不意味着我的程序 ConcurrentHashMap
是线程安全的,containsKey()
和 put()
之间的空闲可能会导致一些混乱。所以我考虑使用它的putIfAbsent()
方法。
但是,当我调用 putIfAbsent(queuename, new MySerializer())
时,我发现每次调用 putIfAbsent 时它都会创建一个 MySerializer
的新实例。但如果我不使用 putIfAbsent
,我将不得不使用类似锁的东西。
我的问题是如何在避免同时使用锁的情况下将元素并发添加到 ConcurrentHashMap 中?
Java 8 添加了新方法到 Map
接口,允许延迟计算潜在的新值。例如:
map.computeIfAbsent(queuename, MySerializer::new);
我正在编写一个简单的消息队列程序,我有多个生产者和多个序列化器(现在不考虑消费者) .生产者使用 String queueName
指定要将消息发送到哪个队列。并且序列化程序 只能在发送过程 期间初始化,因为直到 运行 才知道确切的 number/name 队列。由于我必须使用地图,我想我可以使用
- HashMap 与 lock/synchronized
- ConcurrentHashMap
我想避免使用显式锁,所以我选择了ConcurrentHashMap。但是,使用 ConcurrentHashMap
并不意味着我的程序 ConcurrentHashMap
是线程安全的,containsKey()
和 put()
之间的空闲可能会导致一些混乱。所以我考虑使用它的putIfAbsent()
方法。
但是,当我调用 putIfAbsent(queuename, new MySerializer())
时,我发现每次调用 putIfAbsent 时它都会创建一个 MySerializer
的新实例。但如果我不使用 putIfAbsent
,我将不得不使用类似锁的东西。
我的问题是如何在避免同时使用锁的情况下将元素并发添加到 ConcurrentHashMap 中?
Java 8 添加了新方法到 Map
接口,允许延迟计算潜在的新值。例如:
map.computeIfAbsent(queuename, MySerializer::new);