我有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并搜索网络时,发现了以下说法:
根据要求,我希望并发读取而不阻塞,这就是为什么我选择ConcurrentHashMap。
答案 0 :(得分:0)
您可以使用并发哈希图中的putIfAbsent方法来代替使用if else块,而第二件事,您不应在并发哈希图中使用外部锁定。