單例模式的幾種可行方式

2021-08-22 09:52:05 字數 2080 閱讀 9840

單例的概念

單例模式是一種物件建立模式,他用於產生乙個物件的具體例項,它可以確保系統中乙個類只產生乙個例項。

對於頻繁使用的物件,可以省略建立物件所花費的時間,對於那些重量級的物件而言,是非常可觀的一筆系統開銷。由於 new 操作的次數減少,因而對系統記憶體的使用頻率也會降低,這將減輕 gc 壓力,縮短 gc 時間。

單例模式的核心在於通過乙個介面返回唯一的物件例項。單例主要需要解決的問題就是要把建立物件的許可權收回來,比如說單例最重要的方法就是把類的構造方法設為 private,這就是把建立物件的許可權收回來,而讓類自身來完成建立自己例項的工作,然後讓類提供外部可以訪問這個例項的方法。

下面是幾種可選擇的單例實現方式。

餓漢式:

/**

* 餓漢式

*/public

class

singleton1

public

static singleton1 getinstance()

public

void

method()

}

餓漢模式是在類建立時就建立例項,是執行緒安全的。所謂餓漢,就是因為在類的例項還未被需要使用時,這個例項就被建立了,因此是不能懶載入,這是餓漢式的缺點。

懶漢dcl式:

/**

* 懶漢dcl式

*/public

class

singleton2

public

static singleton2 getinstance()}}

return instance;

}public

void

method()

}

懶漢模式,相對於餓漢模式區別,是懶漢模式的例項在類的例項需要使用時,才會被建立,是懶載入。在此之上,我們這裡又用到了 dcl(double checked locking)的方式,來保證單例的執行緒安全,還用了 volatile 關鍵字來禁止 jvm 對 instance 相關的操作的指令重排序優化,保證 instance 是唯一的。

靜態內部類式:

/**

* 靜態內部類式

*/public

class

singleton3

public

static singleton3 getinstance()

public

void

method()

/*** 持有單例的靜態內部類

*/private

static

class

instanceholder

}

靜態內部類單例是懶載入的。靜態內部類實現單例主要是依靠 jvm 提供給我們的同步控制,利用 static 和 final 兩個關鍵字, 通過 static 進行區塊初始化資料,保證資料在記憶體中是獨乙份的,final 字段保證資料初始化後無法被修改。由此來保證單例的同步控制。

靜態內部類單例相對於餓漢dcl式的優點是,由於沒用使用 synchronized,所以效能上會有一些優勢。

列舉式:

/**

* 列舉式

*/public

enum singleton4

}

列舉式是利用 enum 的特性來保證其唯一性,它的優點顯而易見,實現起來十分簡單,同時它又是是執行緒安全的。

分別的使用方法:

//餓漢式

singleton1.getinstance().method();

//懶漢dcl式

singleton2.getinstance().method();

//靜態內部類式

singleton3.getinstance().method();

//列舉式

singleton4.instance

.method();

以上是單例模式的幾種可行方式。

單例模式的幾種方式

學習設計模式有一段時間了,今天恰好用到了單例,而且單例模式比較常用,面試常考,比較重要。為了方便我不再一步一步詳細的解釋,下面只是給出幾種常用的用法 public class singleton public static singleton getinstance public class sin...

單例模式實現的幾種方式

單例模式三個主要特點 1 構造方法私有化 2 例項化的變數引用私有化 3 獲取例項的方法共有。package com.ctl.singleton 懶漢式單例 該模式的特點是類載入時沒有生成單例,只有當第一次呼叫 getlnstance 方法時才去建立這個單例 注意 如果編寫的是多執行緒程式,則不要刪...

單例模式的幾種實現方式

單例模式莫過於是我們最常用的設計模式之一了,它的優缺點就是 優也單例,缺也單例 當然應用它方面優點還是較多些的,所以下面我們看看,常用的幾種實現方式有哪些吧。這種是最基本的實現方式,最大的問題就是不支援多執行緒,由於沒有加鎖,嚴格上並不算單例模式。public class singleton pub...