Java HashSet 对于只读是线程安全的吗?

2022-09-01 08:07:27

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

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


答案 1

来自 Javadoc:

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

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


答案 2

HashSet如果以只读方式使用,则将是线程安全的。这并不意味着您传递给的任何 Set 都是线程安全的。Collections.unmodifiableSet()

想象一下,这个幼稚的实现缓存了最后一个检查的值:contains

Object lastKey;
boolean lastContains;

public boolean contains(Object key) {
   if ( key == lastKey ) {
      return lastContains;
   } else {
      lastKey = key;
      lastContains = doContains(key);
      return lastContains;
   }
}

显然,这不是线程安全的。


推荐