gpt4 book ai didi

java - HashTable 同步方法和竞争条件

转载 作者:行者123 更新时间:2023-12-01 17:51:51 26 4
gpt4 key购买 nike

我试图在这里掌握 Collection ,并在 Race condition 找到了一篇文章

它指出以下代码可能会导致竞争条件:

if (! hashtable.contains(key)) {
hashtable.put(key, value);
}

我在一定程度上理解了那里的解释,但是我有一个疑问,既然HashTable的方法是同步的,怎么可能当thread1正在执行put()方法获取整个Hashtable的锁时,其他thread2可以执行 containskey() 方法吗?这两个方法不是在哈希表锁上同步吗?

最佳答案

同步于HashTable针对每个方法:仅在方法调用期间获取并持有锁。

这里的代码相当于:

boolean contains;
synchronized (hashtable) {
contains = hashtable.contains(key);
}

if (!contains) {
synchronized (hashtable) {
hashtable.put(key, value);
}
}

完全有可能另一个线程在这两个同步块(synchronized block)之间交错,从而导致竞争条件。

值得注意的是HashTable实际上已被弃用,仅出于遗留原因而保留。更现代的替代方案是 Collections.synchronizedMap(new HashMap<>()) (从同步角度来看,其行为基本相同; see this question ),或 ConcurrentHashMap ,它提供了自动更新 map 的方法,例如

concurrentHashMap.putIfAbsent(key, value);

Java 8 map 确实提供 computeIfAbsent ,但不保证它是原子的,除了 ConcurrentHashMap 中。 .

关于java - HashTable 同步方法和竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49253368/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com