java - Java 中的哈希表和同步

标签 java multithreading synchronization hashtable

我读到哈希表是线程安全的,因为它是同步的。考虑这个代码片段

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/

相关文章:

c++ - [C++] 对于线程中的 'sleep' 函数,这是否是一种有效的方法?

c# - 我是否需要 Dispose() 或 Close() 一个 EventWaitHandle?

java - 如何同步 2 个作业/进程

python - 不确定我是否应该使用线程?

c - 同步父子进程

java - App Engine 日志中的/_ah/queue/__deferred__

java - Spring Boot中通过读取文件进行操作

java - 带有自定义对象的数组列表

java - 如何让子类使用父类的 protected 方法?

java - Java线程内部线程之间的通信