Java HashSet 线程安全只读吗?

新手上路,请多包涵

如果我在通过 Collections.unmodifiableSet() 运行 HashSet 之后有一个 HashSet 实例,它是线程安全的吗?

我问这个是因为 Set 文档指出它不是,但我只执行读取操作。

原文由 Asaf Mesika 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

来自 Javadoc:

请注意,此实现不是同步的。如果多个线程并发访问一个散列集,并且至少有一个线程修改了该集,则必须在外部进行同步

阅读不会修改集合,因此你很好。

原文由 Brian Roach 发布,翻译遵循 CC BY-SA 2.5 许可协议

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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题