比如說我要寫一個單例模式 不用sycrynized同步方法 用volitile修飾
private Sigleton(){
}
private static volitile Sigleton s = null;
public static Sigleton getInstance(){
if (s==null){
s= new Singleton();
}
return s;
}
這樣能不能解決線程安全問題。
怎麼理解線程可見性
如果我兩個執行緒同時都進來 if s==null 最後還不是new出兩個sigleton物件嗎?
女神的闺蜜爱上我2017-06-23 09:16:04
如果new的開銷很小的話,你這樣寫完全沒問題。但如果初始化開銷很大,那還是得用 synchronized 。典型的 雙檢查鎖 是這樣寫的:
private Singleton() {}
private static volitile Singleton s = null;
public static Singleton getInstance() {
if (s == null) {
synchronized (Singleton.class) {
if (s == null) {
s = new Singleton();
}
}
}
return s;
}
代言2017-06-23 09:16:04
怎麼理解線程可見性
先理解記憶體模型。
線程並沒有直接修改主內存中的變量,而是先寫自己的工作內存,然後再同步到主內存中,如果還沒同步,其他的線程是看不到修改的(他們還是看到自己的工作記憶體的快取)。