Java HashSet 对于只读是线程安全的吗?
2022-09-01 08:07:27
如果我在通过 Collections.unmodifiableSet() 运行 HashSet 后有一个 HashSet 的实例,它是线程安全的吗?
我之所以问这个问题,是因为Set文档指出它不是,但我只执行读取操作。
如果我在通过 Collections.unmodifiableSet() 运行 HashSet 后有一个 HashSet 的实例,它是线程安全的吗?
我之所以问这个问题,是因为Set文档指出它不是,但我只执行读取操作。
来自 Javadoc:
请注意,此实现不是同步的。如果多个线程同时访问哈希集,并且至少有一个线程修改了该集,则必须在外部同步该哈希集
阅读不会修改一个集合,因此你很好。
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;
}
}
显然,这不是线程安全的。