設計模式 單例模式

2021-10-04 20:40:00 字數 1526 閱讀 2887

單例模式就是保證乙個類只有乙個例項,並提供乙個訪問它的全域性訪問點。

在系統中,有些物件只需要存在乙個,或者說這類物件若存在多個,則有可能導致一些問題,如:資源過量使用、程式行為異常和資料不一致等問題。資料庫連線池、執行緒池等都是這類物件。

節省建立物件的時間,特別是對於那些重量級物件而言。

new操作次數減少,能夠降低系統記憶體的使用頻率,從而減少gc次數,進而縮短gc停頓時間(stop-the-world)

我們知道靜態變數在程式載入了類的位元組碼後就會被分配空間,而不用去建立任何例項物件。如果程式某次執行中一直沒用這個物件,就會造成資源的浪費。而通過單例模式,可以實現在需要的時候才建立物件,這樣就可以避免資源的浪費,同時也使程式更加靈活。

5.1、餓漢式:類載入時構建,執行緒安全

public

class

singleton

private

singleton()

}

5.2、懶漢式:第一次被使用時構建,執行緒不安全
public

class

singleton

return ourinstance;

}private

singleton()

}

為什麼是執行緒不安全的?當多個執行緒進入到if語句時,就會建立多個例項,因此是執行緒不安全的。

如果想要執行緒安全,只需要在getinstance()方法加上synchronized關鍵字即可,不過會導致執行緒阻塞。

5.3、雙重檢查加鎖

public

class

singleton}}

return ourinstance;

}private

singleton()

}

【擴充套件】上面的synchronized**塊和synchronized修飾在方法上有什麼區別?可以直接修飾在方法上嗎?

【擴充套件】第一行和第二行if (ourinstance == null)的作用分別是什麼?可以只用一行嗎?

【擴充套件】volatile關鍵字的作用是什麼?

5.4、內部靜態類

public

class

singleton

public

static singleton getinstance()

private

singleton()

}

在沒有呼叫 getinstance() 方法之前,靜態內部類不會進行初始化,在第一次呼叫該方法後就生成了唯一乙個例項。

5.5、列舉方式:執行緒安全,防止反射攻擊問題和序列化問題

public

enum enumsingleton

}

【擴充套件】為什麼說列舉方式的單例能夠防止反射攻擊和序列化問題?

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...

設計模式 單例模式

class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...

設計模式 單例模式

單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...