我的应用程序中有多个线程同时访问BitSet。该文档说:
如果没有外部同步,则BitSet对于多线程使用是不安全的。
它没有说读或写是否不安全。谁能解释。
BitSet仅当初始化的最后一个操作BitSet与读取该操作的操作之间存在“先于”关系时,A 对于只读操作才是安全的。
BitSet
最简单的方法是使用final。例如:
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。但是,这会在每次读取和写入变量时插入一个内存屏障。
volatile
注意,相同的推理适用于所有非线程安全的“有效不变”的对象。即具有可变状态的对象,并且您不会对其进行突变。