2015-11-02 32 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的引用。但是,這會在每次讀取和寫入變量時插入內存屏障。


請注意,相同的推理適用於所有非線程安全的「有效不可變的」對象;即您不會變異的可變狀態的對象。

相關問題