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

Java BitSet线程对于并发只读操作是否安全?

安泰平
2023-03-14
问题内容

我的应用程序中有多个线程同时访问BitSet。该文档说:

如果没有外部同步,则BitSet对于多线程使用是不安全的。

它没有说读或写是否不安全。谁能解释。


问题答案:

BitSet仅当初始化的最后一个操作BitSet与读取该操作的操作之间存在“先于”关系时,A 对于只读操作才是安全的。

最简单的方法是使用final。例如:

public class BitsetHolder {
    private final BitSet b;

    public BitSetHolder() {
        b = new BitSet();
        // operations to initialize b.
    }

    public BitSet getBitSet() {
        return b;
    }
}

这足以确保BitSet“安全发布”。

但是,如果您不执行此类操作,则无法保证读取的线程BitSet将看到完全初始化的状态。

显式同步的另一种替代方法是使用volatile变量来保存对的引用BitSet。但是,这会在每次读取和写入变量时插入一个内存屏障。

注意,相同的推理适用于所有非线程安全的“有效不变”的对象。即具有可变状态的对象,并且您不会对其进行突变。



 类似资料:
  • tcp套接字是具有双向读写功能的endpoint。在java中,我们可以获得套接字的InputStream和OutputStream。 同时使用这些流是否安全? 据我所知,有一个连接能够在任何给定时间从一个endpoint发送或接收到其他数据。 我正在基于SocketChannels实现nio传输层,我想保留一个线程用于所有写入,一个线程用于接受和读取,但我不确定如果我的线程同时尝试在同一个套接字

  • 问题内容: 如果我通过Collections.unmodifiableSet()运行HashSet的实例后,它是否是线程安全的? 我问这个问题是因为Set文档指出不是,但是我只执行读取操作。 问题答案: 从Javadoc: 请注意,此实现未同步。如果多个线程同时访问哈希集,并且至少有一个线程修改了哈希集,则必须在外部对其进行同步 阅读不会修改一组,因此您没问题。

  • 问题内容: Redis如何处理(来自不同客户端的)多个线程来更新Redis中的相同数据结构?对于这种用例,建议的最佳实践是什么? 问题答案: 如果您在某个时候读了《小红衣人》一书,这句话就来了。 “您可能不知道,但是 Redis实际上是单线程的 ,这确保了每个命令都是原子的。 在执行一个命令时,不会再运行其他命令 。” 看看http://openmymind.net/2012/1/23/The-L

  • 根据Go博客, 地图对于并发使用是不安全的:它没有定义当您同时读写地图时会发生什么。如果需要从并发执行的goroutines读取映射和向映射写入映射,则访问必须通过某种同步机制进行调解。(来源:https://blog.golang.org/go-maps-in-action) 有人能详细说明一下吗?跨例程的并发读取操作似乎是允许的,但是如果尝试读取和写入同一个键,并发读取/写入操作可能会生成竞争

  • 问题内容: 我一直在假设线程安全也不是线程安全,但是在最近的一次讨论中,一位同事告诉我线程安全。 因此,我做了一些研究,却一无所获。很多人认为它是线程安全的,很多人认为它不是线程安全的。而且,最重要的是,文档没有以一种或另一种方式说任何话,不是为了,甚至不是。 那是什么呢? 问题答案: 这是指向Java 7 中Calendar和GregorianCalendar的源代码的链接。 如果阅读该代码,您

  • 类AnagramGameDefault模拟一个字谜游戏。 submitScore()应该重新计算位置,得分最高的位置为1,同一位置上可以有多个球员。 tester类: