共享地图

时间:2016-03-18 12:09:40

标签: java multithreading

我有一个ConcurrentHashMap

public static Map<Short, Long> timer = new ConcurrentHashMap<Short, Long>();

此共享内存中的元素可能由两个线程添加或删除。当我尝试访问线程中的一个值时,如何摆脱java.lang.NullPointerException?

3 个答案:

答案 0 :(得分:1)

引自ConcurrentHashMap.get()

  

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

     

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

     

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

如您所见,如果给定的键为空,它只会抛出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
    }

您不需要同步,因为get()操作是原子操作。此外,只要确保密钥永远不为空,就不会抛出NullPointerException

答案 1 :(得分:0)

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

您总是可以编写像

这样的代码

不推荐:

Map map = new ConcurrentHashMap<>();
synchronized(map){
   if(map.containcKey(key)){
      ///blah blah blah
   }
}

这将帮助您避免nullpointer,但它无视使用并发hashmap的目的。因此,在我看来,拥有代码故障安全是唯一的选择。

答案 2 :(得分:0)

你可以这样试试:

    Map<String, Optional<String>> map = new ConcurrentHashMap<>();
    map.getOrDefault(key, Optional.empty()).map(value -> /* do actual stuff here*/);