答案 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
的引用。但是,这会在每次读取和写入变量时插入内存屏障。
请注意,相同的推理适用于所有非线程安全的“有效不可变”对象;即具有可变状态但不会发生变异的对象。