(Java) 为什么非同步的HashSet允许同步使用?

(Java) Why is a HashSet allowed to be used synchronously if it is non synchronized?

我一直在阅读 HashMapHashSetHashTable 之间的区别。我注意到的一件关键事情是,我发现 HashMap/HashSet 不同步,而 HashTable 是同步的。

然而,在我之前看到的代码库中,有几个地方使用了这样的块:

synchronized (hashSet) {
    //Some code involving the hashset 
}

如果 HashSet 不同步,这怎么可能? synchronized 块是否只是允许我们使用非同步数据结构,就好像它是同步的一样?

如果 HashSet 是同步的,我们是否不必包括 synchronized() {} 块?

一个synchronized块需要一些对象来同步。当一个 HashSet 被称为不同步时,它只是意味着它的方法本身不同步,如果你打算在多线程上下文中使用它,你应该自己处理同步(例如,通过 synchronizingHashSet 对象上,如您的代码段所示)。