如果我在通过 Collections.unmodifiableSet() 运行 HashSet 之后有一个 HashSet 实例,它是线程安全的吗?
我问这个是因为 Set 文档指出它不是,但我只执行读取操作。
原文由 Asaf Mesika 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果我在通过 Collections.unmodifiableSet() 运行 HashSet 之后有一个 HashSet 实例,它是线程安全的吗?
我问这个是因为 Set 文档指出它不是,但我只执行读取操作。
原文由 Asaf Mesika 发布,翻译遵循 CC BY-SA 4.0 许可协议
HashSet
如果以只读方式使用,将是线程安全的。这并不意味着您传递给 Collections.unmodifiableSet()
的 任何 Set 都是线程安全的。
想象一下这个 contains
的天真实现缓存了最后检查的值:
Object lastKey;
boolean lastContains;
public boolean contains(Object key) {
if ( key == lastKey ) {
return lastContains;
} else {
lastKey = key;
lastContains = doContains(key);
return lastContains;
}
}
显然这不是线程安全的。
原文由 Mark Peters 发布,翻译遵循 CC BY-SA 2.5 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
来自 Javadoc:
阅读不会修改集合,因此你很好。