小编典典

如果仅在构造函数中编写Collection线程安全吗?

java

假设我们有这堂课

final class Foo {
    private final Set<String> bar = new HashSet<>();

    public Foo() {
        bar.add("one");
        bar.add("two");
        bar.add("three");
    }

    public boolean contains(final String s) {
        return bar.contains(s);
    }
}

从多个线程实例化Foo并调用contains该对象是否是线程安全的?

  1. 对集合的引用是privatefinal。没有人可以直接访问该集合。
  2. 唯一的写访问发生在构造函数中
  3. 执行完构造函数后,集合将仅读取而不进行修改。

如果没有,是否有一个纯Java替代Guava的不可变集合?


阅读 289

收藏
2020-11-30

共1个答案

小编典典

前提是线程安全

1)构造函数不会在完全构造引用之前泄漏其引用。

2)没有人可以使用任何方式访问收藏集。

3)无法创建可以编辑集合的子类。

但是,作为一般规则,如果要实现此功能,请使用番石榴中的不可变集合,这样可以使行为对程序员明确,然后可以安全地返回整个地图。我认为在纯Java中,您可以返回集合的不可修改的视图。

2020-11-30