單例模式 懶漢模式與餓漢模式

2021-09-11 05:52:46 字數 1768 閱讀 5739

1、概述

單例模式是23種設計模式之一,也是最常用的設計模式。

就是系統執行期間,有且僅有乙個例項。

例:

package cn.smbms.utils;

/** * 單例類

* @author 14062

* */

public class singleton

//向外界提供獲取例項的靜態方法

public static singleton getinstance()

return singleton;

}}

解:必須滿足單例模式的三個關鍵點:

2、懶漢模式

概述:即在類載入時不建立例項,採用延遲載入的方式,在執行呼叫時建立例項。上面一段**即為「懶漢模式」,此種方式雖然保持了其延遲載入的特性,但存在安全問題,在多執行緒下無法正常工作。如果需要解決執行緒安全的問題,最簡單的方式就是使用synchronized關鍵字實現同步。

例:

//向外界提供獲取例項的靜態方法

public static synchronized singleton getinstance()

return singleton;

}

3、餓漢模式

//直接例項化

private static singleton singleton=new singleton();

//私有構造

private singleton(){}

//向外界提供獲取例項的靜態方法

public static singleton getinstance()

注:靜態方法getinstance()直接返回已經自行例項化好的物件,這種方式基於classloader機制,有效的避免了多執行緒的同步問題。但是也有可能會有其他的地方(或者其他靜態方法) 導致類裝載,而此時單例類singleton在類裝載時就例項化,顯然沒有達到lazy loading的效果。在實際開發應用中,可能既需要lazy loading的效果,在效率與安全方面又***,這就需要用靜態內部類來解決問題。

4、靜態內部類

package cn.smbms.tools;

/** * 單例類demo

* @author 14062

* */

public class singleton

//靜態內部類

public static class singletonhelper

/** 只有通過呼叫getinstance()方法時,才會主動呼叫singletonhelper類,

* 並完成對singletonhelper的載入,從而例項化singleton,達到lazy loading的效果。

*/public static singleton getinstance()

public static singleton test()

}

5、小結

餓漢模式:在類載入時就完成了初始化,所以類載入比較慢,但獲取物件速度快。

靜態內部類:即在單例類內部定義靜態內部類,在靜態內部類中完成物件的例項化操作,只有主動呼叫靜態內部類時才會初始化例項,從而保證了執行緒的安全並達到延遲載入的效果。

單例模式(懶漢模式與餓漢模式)

1.單例模式 應用場景 當系統中只需要乙個物件就夠了,如任務管理器 古代皇帝 現代老婆 作用 保證在乙個系統中有且只有乙個例項 型別 餓漢模式 懶漢模式 2.餓漢模式 public class singleton 2.建立類的唯一例項,使用private static關鍵字修飾 private st...

單例模式 餓漢模式與懶漢模式

餓漢模式 餓漢模式是執行緒安全的 class singleton static singleton single public static singleton gettarget 懶漢模式 懶漢模式是有可能執行緒不安全的 下面展示不安全的寫法 class singleton2 static sin...

單例模式(餓漢模式與懶漢模式)

描述 乙個類永遠只有乙個例項 物件 作用 節約記憶體,提高效能。比如 電腦的任務管理器。因為物件越多,佔的記憶體越大,容易造成記憶體溢位。1.餓漢單例模式 物件已經建立好了,要用就直接用 步驟a.定義乙個類,把構造器私有 b.定義乙個靜態變數儲存乙個物件 c.提供乙個靜態返回單例物件方法 class...