(Java) 为什么非同步的HashSet允许同步使用?
(Java) Why is a HashSet allowed to be used synchronously if it is non synchronized?
我一直在阅读 HashMap
、HashSet
和 HashTable
之间的区别。我注意到的一件关键事情是,我发现 HashMap
/HashSet
不同步,而 HashTable
是同步的。
然而,在我之前看到的代码库中,有几个地方使用了这样的块:
synchronized (hashSet) {
//Some code involving the hashset
}
如果 HashSet
不同步,这怎么可能? synchronized 块是否只是允许我们使用非同步数据结构,就好像它是同步的一样?
如果 HashSet
是同步的,我们是否不必包括 synchronized() {} 块?
一个synchronized
块需要一些对象来同步。当一个 HashSet
被称为不同步时,它只是意味着它的方法本身不同步,如果你打算在多线程上下文中使用它,你应该自己处理同步(例如,通过 synchronizing
在 HashSet
对象上,如您的代码段所示)。
我一直在阅读 HashMap
、HashSet
和 HashTable
之间的区别。我注意到的一件关键事情是,我发现 HashMap
/HashSet
不同步,而 HashTable
是同步的。
然而,在我之前看到的代码库中,有几个地方使用了这样的块:
synchronized (hashSet) {
//Some code involving the hashset
}
如果 HashSet
不同步,这怎么可能? synchronized 块是否只是允许我们使用非同步数据结构,就好像它是同步的一样?
如果 HashSet
是同步的,我们是否不必包括 synchronized() {} 块?
一个synchronized
块需要一些对象来同步。当一个 HashSet
被称为不同步时,它只是意味着它的方法本身不同步,如果你打算在多线程上下文中使用它,你应该自己处理同步(例如,通过 synchronizing
在 HashSet
对象上,如您的代码段所示)。