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

时间:2015-11-02 09:55:41

标签: java multithreading concurrency thread-safety bitset

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

  

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

它没有说是不安全的阅读或写作。任何人都可以解释一下。

1 个答案:

答案 0 :(得分:3)

如果初始化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的引用。但是,这会在每次读取和写入变量时插入内存屏障。

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