Java中的哈希表和同步

bra*_*orm 8 java multithreading synchronization hashtable

我已经读过哈希表是线程安全的,因为它是同步的.考虑这段代码

if(!hashtable.contains(key)){
hashtable.put(key,value);
}
Run Code Online (Sandbox Code Playgroud)

哈希表上的操作可能无法同步.例如,如果Thread t1访问hastable并检查密钥并同时Thread t2检查密钥,则在t1执行put之前.现在,两个线程都在if块内,并且会覆盖键值.

所以同步块是必要的.

synchronized {
if(!hashtable.contains(key)){
    hashtable.put(key,value);
    }
}
Run Code Online (Sandbox Code Playgroud)

这种理解是否正确?或者hastables对在hastables上执行的操作是安全的.我在阅读这篇关于竞争条件的帖子时遇到了这个疑问

Jef*_*rey 13

你是否需要synchronized阻止你是正确的.该Hashtable's方法是synchronized,但你仍然有调用外部的多种方法时有比赛的可能性synchronized块.例如,当两个线程同时调用时,内置同步可以防止出现问题put.

您可能还想查看 ConcurrentHashMap