ConcurrentHashMap行为和问题

时间:2018-07-17 00:53:50

标签: java data-structures concurrenthashmap

我有4个线程-该线程中的2个确实要更新,而2个线程的确是在并发HashMap上读取的。代码如下:

private static ConcurrentHashMap<String, String> myHashMap = new ConcurrentHashMap<>();
private static final Object lock = new Object();

线程1和线程2的运行方法(键和值是一个字符串)

synchronized (lock) {
    if (!myHashMap.containsKey(key)) {
        myHashMap.put(key, value);
    } else {
        String value = myHashMap.get(key)
        // do something with the value
        myHashMap.put(key, value);
    }
}

线程3和线程4的run方法执行打印

for (Entry<String, String> entry : myHashMap.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();
    System.out.println("key, " + key + " value " + value);
}

以上ConcurrenHashMap代码的用法是否存在问题? 因为当我阅读Javadoc并搜索网络时,发现了以下说法:

  1. 在依赖于其线程安全性的程序中,此类可以与Hashtable完全互操作,而不必依赖于其同步详细信息。(注意-我知道打印线程结果可能不是最新的结果,但是只要更新线程能够正确执行操作就可以。)
  2. 网站上也有人声称同一Iterator不能用于2个或更多不同的线程。所以我想知道打印方法是否在上述2个线程中使用相同的Iterator。为什么我们不能在2个不同的线程中使用相同的Iterator?

根据要求,我希望并发读取而不阻塞,这就是为什么我选择ConcurrentHashMap。

1 个答案:

答案 0 :(得分:0)

您可以使用并发哈希图中的putIfAbsent方法来代替使用if else块,而第二件事,您不应在并发哈希图中使用外部锁定。