什麼是單例模式?
單例模式就是一個類只能產生一個實例,如果控制一個類只能產生一個實例呢?
我們在創建對象時一般都是使用new來產生對象即調用類的構造方法,如果將構造方法私有化那麼就控制了外部類隨意創建對象的能力。
所以單例的實現可以總結爲:
1.構造方法私有化
2.類中含有一個本類型的靜態的私有化的屬性
3.對外提供一個靜態的返回本類型的靜態方法
單例模式的實現分爲懶漢式和餓漢式
餓漢式:
public class Singleton { // 構造器私有化 private Singleton() { } // 私有化 靜態 本類型的屬性 private static Singleton instance = new Singleton(); // 對外提供一個靜態的返回本類型的方法 public static Singleton getInstance() { return instance; } }
懶漢式
public class Singleton { // 構造器私有化 private Singleton() { } // 私有化 靜態 本類型的屬性 private static Singleton instance = null; // 對外提供一個靜態的返回本類型的方法 public static Singleton getInstance() { if(instance==null){ instance=new Singleton(); } return instance; } }
懶漢式的代碼在併發環境下回存在線程不安全的情況,即有可能會破壞單例模式,導致內存中出現對各SIngleton實例的情況,例如,如果線程A,B同時訪問getInstance()方法,當A進入 instance=new Singleton()時B線程訪問此時instance依然爲空,這是就會破壞單例模式
解決辦法
1.直接使用餓漢式
2.對懶漢式getInstance()方法添加synchronize關鍵字