【发布时间】:2020-07-06 01:42:34
【问题描述】:
我知道您可以使用
获得线程安全的 HashSetHashSet<String> mySynchronizedHashSet = Collections.synchronizedSet(new HashSet<String>());
但是,如果每次要修改它时使用传统的 HashSet 并用 synchronized 块括起来呢?
synchronized(myRegularHashSet) {
myRegularHashSet.add(new String());
}
除了每次要安全地修改集合时记得添加synchronized 关键字的缺点之外,这两种技术是否等效?我需要同时使用两者吗?他们在性能方面如何比较?假设 HashSet 仅在已知且罕见的情况下存在并发修改的风险,您是否可以通过仅在必要时同步它来节省时间?
编辑 1:刚刚找到 this previous answer,它回答了我的一些问题(尽管不是关于性能的问题)。
编辑 2:为了解决我自己的一个问题“(我是否需要同时使用两者?”),我将引用 the Javadoc,“用户在遍历返回的集合时必须手动同步它通过迭代器、拆分器或流。”我假设这意味着在使用例如迭代器时总是需要同步块,但没有必要使用同步块和同步对象。
【问题讨论】:
标签: java synchronization hashset synchronized