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