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



我的应用程序中有多个线程同时访问一个BitSet。文件上写着:

在没有外部同步的情况下,BitSet对于多线程使用是不安全的。

它没有说明阅读或写作是否不安全。有人能解释吗。

BitSet只有在初始化BitSet的最后一个操作和读取它的操作之间存在"之前发生"关系的情况下,才对只读操作安全。

实现这一点的最简单方法是使用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的引用。然而,这会在变量的每次读取和写入上插入一个内存屏障。


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

最新更新