首先要明確的是!
單例類只有一個實例!自行實例化提供這個唯一的實例!
單例模式三個要點:
- 私有構造方法,private!
- 一個自己的私有靜態變量!static!
- 一個返回自己的靜態公有方法!public static 我自己 method !
單例模式常見兩種分類
餓漢模式
簡單來說就是,不管我什麼時候喫,一開始就給我準備好!
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
}
懶漢模式
簡單來說就是,我太懶了,等到等快考試的時候再複習吧!
public class Singleton {
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
優點:
- 節約內存空間
- 避免老是創建銷燬,提高性能
- 避免對共享資源多重佔用
- 可以全局訪問
適用場景:
- 需要多次實例化然後銷燬的對象
- 創建對象很麻煩的對象,又老是用到的對象
- 有狀態的工具類對象
- 頻繁訪問數據庫和文件的對象,和2一樣咯
- 總之特點就是所有場景只需要一個對象
注意事項:
- 不能用反射,只能用自己提供的方法,不然會new一個新的對象!
- 不要做單開單例類對象與類中靜態引用的危險操作(沒懂
- 多線程使用單例,注意線程安全
一些細節~
- Jvm不會垃圾收集一直不用的單例!
- 一個Jvm中,除了使用反射,不會出現新的單例
- 懶漢式單例線程不安全啊!
- 單例模式不止這些啊!
- 這兩種單例是不能被繼承的!
- Java中餓漢要優於懶漢!
學習資料:卡奴達摩的專欄