java - volatile 能否解決執行緒共享資料的安全性。
欧阳克
欧阳克 2017-06-23 09:14:04
0
2
985

比如說我要寫一個單例模式 不用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物件嗎?

欧阳克
欧阳克

温故而知新,可以为师矣。 博客:www.ouyangke.com

全部回覆(2)
女神的闺蜜爱上我

如果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;
}
代言

怎麼理解線程可見性

先理解記憶體模型。

線程並沒有直接修改主內存中的變量,而是先寫自己的工作內存,然後再同步到主內存中,如果還沒同步,其他的線程是看不到修改的(他們還是看到自己的工作記憶體的快取)。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板