Java BitSet 对于并发只读操作是线程安全的吗

Is Java BitSet thread safe for concurrent readonly operations

我的应用程序中有多个线程同时访问 BitSet。 documentation 表示:

A BitSet is not safe for multithreaded use without external synchronization.

它没有说它是否不适合阅读或写作。谁能解释一下。

如果初始化 BitSet 的最后一个操作与读取它的操作之间存在 "happens before" 关系,则 BitSet 仅对只读操作是安全的。

实现此目的的最简单方法是使用 final。例如:

public class BitsetHolder {
    private final BitSet b;

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

    public BitSet getBitSet() {
        return b;
    }
}

这足以确保 BitSet 是 "safely published"。

但是,如果您不这样做,则无法保证读取 BitSet 的线程将看到完全初始化的状态。

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


请注意,同样的推理适用于所有非线程安全的 "effectively immutable" 对象;即具有可变状态但您不会改变的对象。