關於單例模式,需要解決三個方面的問題
(1)執行緒安全問題。
(2)效能問題。
(3)懶載入(資源占有問題)。
關於下面幾種方式的缺點,除了dcl,holder和列舉單例模式其他只做簡單描述,具體可自行了解。
public class lazy
public synchronized static lazy getinstance()
return lazy;
}}
public class hungry
public static hungry getinstance()
}
public class dcl
public static dcl getinstance()}}
return dcl;
}}
由於懶漢式鎖粒度太大,考慮把鎖加在**塊上,但是如果同時兩個執行緒訪問getinstance(),執行緒1獲取鎖,執行緒2做了1的判斷在等待,此時如果執行緒1建立了dcl物件,那麼如果不加3的話會重複建立,所以3必須要加,這種方式的單例模式被稱為雙重加鎖模式。
步驟3,非原子性 分三步:1、為物件分配記憶體空間。2、建立物件。3、物件指向記憶體空間,2,3有可能重排序,但是不影響結果,第三步進行之後物件將不為null,所以如果2,3重排序,先執行3,第乙個判斷不為空,會返回乙個物件,但實際物件還未建立,會返回nullpointexception,這就是指令重排給我們帶來的影響,所以加volatail,防止指令重排。
public class holder
public static holder getinstance()
}
建立乙個獲取物件的靜態內部類,它裡面的holder例項物件不會在類載入的時候被建立,只在被呼叫時被建立一次,滿足所有要求。
public class enumsingleton
private enum enumslt
}public static enumsingleton getinstance()
}
類似holder模式的靜態內部類,首先列舉類的構造方法是私有的,這就保證不會被其他方法通過構造器new出物件,再來instance就是這個列舉類的物件,會在呼叫的時候被例項化,這樣保證了懶載入,在例項化的時候會呼叫構造器,建立instance物件,因為列舉類中的物件都是static final 修飾的,所以instance物件也只會被例項化一次,這樣就保證了執行緒安全性,因為沒加鎖,所以效能也相對較高。
public class threadlocalsingleton
};private threadlocalsingleton() {}
public static threadlocalsingleton getinstance()
}
單例模式介紹
使用單例模式有乙個必要條件 在乙個系統要求乙個類只有乙個例項時才應當使用單例模式。單例模式又分為餓漢式和懶漢式。1.餓漢式 public class singleton 靜態工廠方法 public static singleton getinstance 單例類的乙個最重要的特點是類的構造器是私有的...
單例模式介紹
簡單來說就是建立物件時無論怎麼建立都只有乙個例項物件 介紹 只有在用到這個物件的時候才會去建立這個物件。存在問題 執行緒不安全,當使用多執行緒時會出現建立多個物件的情況。演示 public class bbb 建立靜態bbb物件 private static bbb bbb null 建立獲得bbb...
單例模式的介紹
單例的介紹 在專案的過程中存在著這樣特點的一些類,頻繁使用的物件,比如 的訪問記數器,資料庫的連線池,執行緒池等等方面只允許擁有乙個物件,允許擁有乙個例項。這樣的情況下會用到單例。單例模式的好處 1 對於頻繁使用的物件,可以省略建立物件所花費的時間,減少系統的開銷 2 由於new操作的次數減少,因而...