繁体   English   中英

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

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

我正在编写一个简单的消息队列程序,并且有多个生产者多个序列化器 (现在不考虑使用消费者)。 生产者通过使用String queueName指定要向其发送消息的队列。 而且串行器只能在发送过程中初始化,因为直到运行,队列的确切数目/名称才知道。 由于我必须使用地图,因此我认为我可以使用

  • HashMap与锁/同步
  • 的ConcurrentHashMap

我想避免使用显式锁,所以我选择ConcurrentHashMap。 但是,使用ConcurrentHashMap并不意味着我的程序ConcurrentHashMap是线程安全的, containsKey()put()之间的空闲状态可能会引起混乱。 因此,我考虑使用其putIfAbsent()方法。

但是,当我调用putIfAbsent(queuename, new MySerializer()) ,我发现每次我调用putIfAbsent时,它都会创建MySerializer的新实例。 但是,如果我不使用putIfAbsent ,则必须使用诸如锁之类的东西。

我的问题是如何在避免同时使用锁的同时向ConcurrentHashMap中添加元素?

Java 8向Map接口添加了新方法,这些方法允许延迟评估潜在的新值。 例如:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM