当前位置: 首页 > 面试题库 >

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

朱鹤轩
2023-03-14
问题内容

假设我们有这堂课

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的不可变集合?


问题答案:

前提是线程安全

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

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

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

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



 类似资料:
  • 问题内容: 为了使gettimeofday能够正常工作,当前时间必须全局存储,但是我不确定该函数是否修改了任何全局状态,从而并发执行未定义。 问题答案: gettimeofday是线程安全的。 这里列出的(posix)函数可能不是,gettimeofday不是其中之一。

  • 问题内容: 我一直在花一些时间调试一个导致分段错误的程序。该错误是不确定性和断断续续的,这很烦人。我把范围缩小到了。我怀疑是在两个不同的线程中拆分字符串的调用导致了分段错误。我可以在两个不同的线程中调用吗? 谢谢。 问题答案: 不是可重入的,因此不应在线程化应用程序中使用它,而应使用。

  • 问题内容: 谁能告诉我此类是否是线程安全的? 编辑:我的错是不澄清这个问题。根据JMM常见问题解答: 应该提供初始化安全性的新保证。如果正确构造了一个对象(这意味着对该对象的引用在构造期间不会逸出),那么所有看到对该对象的引用的线程也将看到在构造函数中设置的其最终字段的值,而无需同步。 这使我感到困惑,因为aMap的设置是。所以其他线程可以看到这些 或不 ? 问题答案: 正如已经指出的那样,它是绝

  • 如果我决定使用一个非线程安全的集合并同步它的访问,我是否需要同步构造函数中的任何突变?例如,在下面的代码中,我知道对列表的引用在构造后对所有线程都是可见的,因为它是最终的。但我不知道这是否构成安全发布,因为构造函数中的add没有同步,而且它正在ArrayList的elementData数组中添加一个引用,这是非最终的。

  • 更具体地说,LinkedHashMap有K=String,V=String。 从这个映射中,我可以使用映射方法map.keyset()创建一个包含节点的列表,并使用map.values()方法创建一个包含邻居的单独列表。我还可以创建String类型的数组,或者邻居的String[]类型的数组。 每个节点只能与其在LinkedHashMap中定义为值的邻居通信。 Gossip(push)协议:假设一

  • 问题内容: 如果我使用fopen()调用来在多线程中打开同一文件,然后将数据写入该文件。我是否应该使用互斥锁来确保数据不会混乱? 问题答案: 如果两个线程都使用来打开同一文件,则它们各自将具有独立的文件流(),并由引用同一文件的独立文件描述符支持。您可以独立地写入两个文件流,但是文件的最终结果将取决于线程在何处写入以及何时刷新文件流。除非您控制每个线程的写入位置,否则结果是不可预测的。最简单的事情