2015-11-02 71 views

回答

2

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


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