小编典典

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

java

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

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

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


阅读 361

收藏
2020-11-26

共1个答案

小编典典

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。但是,这会在每次读取和写入变量时插入一个内存屏障。


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

2020-11-26