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