Java多线程访问共享映射中的数据

Java多线程访问共享映射中的数据,java,multithreading,Java,Multithreading,我有一张ConcurrentHashMap public static Map<Short, Long> timer = new ConcurrentHashMap<Short, Long>(); publicstaticmap timer=newconcurrenthashmap(); 此共享内存中的元素可能由两个线程添加或删除。当我尝试访问线程中的一个值时,如何摆脱java.lang.NullPointerException?引用: 返回指定键映射到的值,如果此映

我有一张ConcurrentHashMap

public static Map<Short, Long> timer = new ConcurrentHashMap<Short, Long>();
publicstaticmap timer=newconcurrenthashmap();
此共享内存中的元素可能由两个线程添加或删除。当我尝试访问线程中的一个值时,如何摆脱java.lang.NullPointerException?

引用:

返回指定键映射到的值,如果此映射不包含该键的映射,则返回null

更正式地说,如果这个映射包含从键k到值v的映射,使得key.equals(k),那么这个方法返回v;否则返回null。(最多可以有一个这样的映射。)

抛出: NullPointerException-如果指定的键为null

如您所见,如果给定的键为null,它只会抛出
NullPointerException
。但是,如果给定的密钥没有任何关联,它也会返回null

以下是一个多线程工作的示例:

    ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
    String key = "mykey";
    String value = map.get(key);
    if (value != null) {
        // use value
    } else {
        // no mapping for the given key
    }
ConcurrentHashMap=新的ConcurrentHashMap();
String key=“mykey”;
字符串值=map.get(键);
if(值!=null){
//使用价值
}否则{
//给定密钥没有映射
}

您不需要同步,因为
get()
操作是原子的。此外,只要您确保密钥从不为null,这将不会引发
NullPointerException

我认为null检查是消除nullpointer异常的唯一方法。因为根据定义,并发hashmap将允许您添加或删除多个线程

您总是可以编写这样的代码

不推荐:

Map map = new ConcurrentHashMap<>();
synchronized(map){
   if(map.containcKey(key)){
      ///blah blah blah
   }
}
Map Map=new ConcurrentHashMap();
同步(地图){
if(集装箱地图(钥匙)){
///废话废话
}
}

这将帮助您避免空指针,但它违背了使用并发hashmap的目的。因此,在我看来,代码故障保护是唯一的选择。

您可以这样尝试:

    Map<String, Optional<String>> map = new ConcurrentHashMap<>();
    map.getOrDefault(key, Optional.empty()).map(value -> /* do actual stuff here*/);
Map Map=new ConcurrentHashMap();
map.getOrDefault(key,可选的.empty()).map(value->/*在这里执行实际操作*/);

请提供一个示例来说明您的问题。要么执行不能返回null的操作,要么在使用它之前检查null值,就像处理引用的任何其他情况一样。顺便说一句,ConcurrentHashMap不是列表。