單例設計模式
- 作用: 在應用程序有保證最多只能有一個實例.
- 好處:
2.1 提升運行效率.
2.2 實現數據共享. 案例:application 對象
-
- 懶漢式
3.1 對象只有被調用時才去創建.
3.2 示例代碼
3.3由於添加了鎖,所以導致效率低.
public class lazySingleton { //懶漢式,單例模式! //由於對象需要被靜態方法調用,把方法設置為static //由於對象是static,必須要設置訪問權限修飾符為private , //如果是public 可以直接調用對象,不執行訪問入口 private static lazySingleton ourInstance ; /** *方法名和類名相同,無返回值. *其他類不能實例化這個類對象;對外提供訪問入口 */ private lazySingleton() { } /** *實例方法,實例方法必須通過對象調用 *設置方法為靜態方法 *@return 一個上面的static 對象 */ public static lazySingleton getInstance() { //添加邏輯如果實例化過,直接返回 if(ourInstance==null){ /* * 多線程訪問下,可能出現if 同時成立的情況,添加鎖; 監控這個類下創建一個鎖,每次只允許一個class進入; */ synchronized (lazySingleton.class){ if(ourInstance==null){ //雙重驗證 ourInstance =new lazySingleton(); } } } return ourInstance; } }
3.4 測試
lazySingleton singleton = lazySingleton.getInstance(); lazySingleton singleton1 = lazySingleton.getInstance(); System.out.println(singleton==singleton1); System.out.println(singleton); System.out.println(singleton1); -------------------- true com.test.lazySingleton@60e53b93 com.test.lazySingleton@60e53b93
4.餓漢式 (IDEA 編譯器默認的singleTon)
解決了懶漢式中多線程訪問可能出現同一個對象和效率低問題 ,多個實例共用一個對象!
public class hungerSingleton { private static hungerSingleton ourInstance = new hungerSingleton(); public static hungerSingleton getInstance() { return ourInstance; } private hungerSingleton() { } }