1
我的应用程序中有多个线程同时访问BitSet。 documentation说:Java BitSet对于并发只读操作是安全的
一个BitSet不安全的多线程使用没有外部同步。
它没有说它是不是安全的阅读或写作。任何人都可以解释。
我的应用程序中有多个线程同时访问BitSet。 documentation说:Java 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
的引用。但是,这会在每次读取和写入变量时插入内存屏障。
请注意,相同的推理适用于所有非线程安全的“有效不可变的”对象;即您不会变异的可变状态的对象。