我读到哈希表是线程安全的,因为它是同步的。考虑这个代码片段
if(!hashtable.contains(key)){
hashtable.put(key,value);
}
哈希表的操作可能不同步。例如,如果 Thread t1
访问 hastable 并检查 key,同时 Thread t2
在 t1 执行 put 之前检查 key。现在有两个线程在 if block 内并且发生键值覆盖。
所以同步块(synchronized block)是必要的。
synchronized {
if(!hashtable.contains(key)){
hashtable.put(key,value);
}
}
这个理解对吗?或 hastables 对在 hastables 上执行的操作是安全的。我在阅读这篇文章时产生了疑问 post on race condition
最佳答案
你是对的,你需要 synchronized
block 。 Hashtable 的
方法是synchronized
的,但是在synchronized
block 之外调用多个方法时,您仍然有可能发生竞争。例如,当两个线程同时调用 put
时,内置的同步可以防止出现问题。
您可能还想查看 ConcurrentHashMap
关于java - Java 中的哈希表和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19234719/