我读过哈希表是线程安全的,因为它是同步的。考虑这个代码片段
if(!hashtable.contains(key)){
hashtable.put(key,value);
}
对 hashtable 的操作可能不同步。例如,如果Thread t1
访问 hastable 并检查 key 并同时Thread t2
检查 key,则在 t1 执行 put 之前。现在两个线程在 if 块内,并且发生键值覆盖。
所以同步块是必要的。
synchronized {
if(!hashtable.contains(key)){
hashtable.put(key,value);
}
}
这种理解正确吗?或者对于在 hastables 上执行的操作,hastables 是安全的。我在阅读有关比赛条件的帖子时遇到了这个疑问