Java的單例模式(singleton)
阿新 • • 發佈:2017-08-22
ron 好聽 on() == sin 如果 odin 如同 可能
為什麽需要單例?只因為國家的獨生子女政策(當然現在可以生2個)
單例是一個很孤獨的物種,因為它的類裏面做多只有也僅只有它一個。
常見的是懶漢及餓漢模式,
1.懶漢,為什麽這麽叫,看看英文,原為lazy loading,lazy(懶惰的),laoding(音如同佬),叫懶佬,然後一個佬==一條漢子,為好聽,故懶漢。
最基礎的懶漢模式:
//單例模式 public class Singleton { // 私有化構造方法,使得外部不可能有由new產生實例; private Singleton() { } // 懶漢模式 private static Singleton instance = null; //不加synchronized,線程有問題; public static Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } }
上面有線程安全的問題,如果多線程情況下,可以得出多個實例。
加入synchronized 改進後:
//單例模式 public class Singleton { // 私有化構造方法,使得外部不可能由用new產生實例; private Singleton() { } // 懶漢模式 private static Singleton instance = null; //不加synchronized,線程有問題; public static synchronized Singleton getInstance() { if(instance == null) instance = new Singleton(); return instance; } }
懶,因為用到了才加載。
餓漢,漢就不解釋,上面有。為什麽叫餓?因為不管你有沒使用這個單例,它都會實例化,在內存中,好像一個很饑餓的人,不管什麽,先吃了再說。
具體如下:
//餓漢模式 public class Singleton2 { //私有化構造方法,使得外表不能用new產生一個實例。 private Singleton2(){} //餓漢模式,不管你有沒用這個實例,先實例化。 private static Singleton2 instance =new Singleton2(); public static Singleton2 getInstance(){ return instance; }; }
Java的單例模式(singleton)