首頁  >  問答  >  主體

java - volatile 能否解決執行緒共享資料的安全性。

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

欧阳克欧阳克2674 天前946

全部回覆(2)我來回復

  • 女神的闺蜜爱上我

    女神的闺蜜爱上我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;
    }

    回覆
    0
  • 代言

    代言2017-06-23 09:16:04

    怎麼理解線程可見性

    先理解記憶體模型。

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

    回覆
    0
  • 取消回覆