我读到过哈希表是线程安全的,因为它是同步的。请考虑下面的代码片段
if(!hashtable.contains(key)){
hashtable.put(key,value);
}哈希表上的操作可能不同步。例如,如果Thread t1访问hastable并检查密钥,同时Thread t2在t1执行put之前检查密钥。现在,if块中有两个线程,键值的覆盖发生了。
所以同步块是必要的。
synchronized {
if(!hashtable.contains(key)){
hashtable.put(key,value);
}
}这种理解是正确的吗?或者可加速对象在对可加速对象执行的操作上是安全的。当我阅读这篇post on race condition的时候,我产生了这样的疑问
发布于 2013-10-08 05:04:28
您需要synchronized块的说法是正确的。Hashtable's方法是synchronized的,但是当在synchronized块之外调用多个方法时,您仍然有可能发生竞争。例如,内置的同步可以防止两个线程同时调用put时出现的问题。
您可能还想研究一下ConcurrentHashMap
https://stackoverflow.com/questions/19234719
复制相似问题