Java Concurrenthashmap未在线程之间更新

Java Concurrenthashmap未在线程之间更新,java,hashmap,concurrenthashmap,Java,Hashmap,Concurrenthashmap,我使用的是一个并发hashmap,当jms消息传入时会填充它。每当同一个键进入时,必须覆盖它 现在我面临的问题是:地图总是空的。因此,每次都会添加条目,而不是覆盖条目 不知道我犯了什么错误。请通读代码并帮助我 public class Dispatcher{ private static ConcurrentHashMap<String, Executor> map= new ConcurrentHashMap<>(); public dispatc

我使用的是一个并发hashmap,当jms消息传入时会填充它。每当同一个键进入时,必须覆盖它

现在我面临的问题是:地图总是空的。因此,每次都会添加条目,而不是覆盖条目

不知道我犯了什么错误。请通读代码并帮助我

public class Dispatcher{ 
    private static ConcurrentHashMap<String, Executor> map= new ConcurrentHashMap<>(); 

    public dispatch(String key, String message) { 
    if(map.containsKey(key)){ //this always returns false. Printed to check and it is empty.
         //rest of the code 
    }else{
         map.put(key,new Executor(message)); 
         //rest of the code
    }}
public class MsgListener implements SessionAwareListener {
    Dispatcher dispatcher = new Dispatcher();
    public void onMessage(javax.jms.Message, Session session) {
        //Rest of the code
        dispatcher.dispatch(key,msg);
}}
公共类调度程序{
私有静态ConcurrentHashMap=新ConcurrentHashMap();
公共分派(字符串键,字符串消息){
if(map.containsKey(key)){//这总是返回false.Printed以进行检查,它是空的。
//代码的其余部分
}否则{
map.put(键,新执行器(消息));
//代码的其余部分
}}
公共类MsgListener实现SessionWareListener{
Dispatcher=new Dispatcher();
公共void onMessage(javax.jms.Message,会话){
//代码的其余部分
调度程序。调度(键,消息);
}}
用于测试的输入:

锁1-消息1

锁1-信息2

锁2-信息3

锁3-信息4


dispatcher类在调用类中只实例化一次。我已经测试过,并发现可以打印同一个对象。

您可以共享应该添加到映射中的部分代码吗?代码的其余部分将是一个好主意。您如何知道映射始终为空,而不是键不同?您确定自己是ad吗正在使用相同的键?可能尝试调试?如果您不知道如何进行调试,请至少打印地图的大小,而不只是包含用于测试的示例输入。已使用如图所示的相同键。我假设
Executor
是您自己定义的类,否则
newexecutor(消息)
将无法编译…这可能是问题的根源,也可能不是问题的根源,但在任何情况下都是一个bug:代码中都有一个“先检查后执行”的竞争条件。请使用原子putIfAbsent方法:
if(map.putIfAbsent(key,value)==null){//added}else,而不是检查map.contains()然后根据结果执行map.put(){//未添加}