設計模式 單例模式

2021-10-05 11:31:27 字數 1656 閱讀 4344

目錄

單例模式

懶漢式餓漢式

雙重鎖模式

靜態內部類模式

列舉模式

volatile關鍵字

概念:顧名思義就是只有乙個例項,並且它自己負責建立自己的物件,這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件

特點:類構造器私有,持有自己型別的屬性,對外提供獲取例項的靜態方法

特點:在需要獲取例項物件的時候才去載入

問題:不是執行緒安全,同時兩個執行緒進行獲取例項物件時有可能獲取到不同的物件

package com.anran.example.singleton;

public class lazymode

/*** 唯一獲取當前物件例項的靜態方法

* @return

*/public static lazymode getinstance()

return lazymodes;

}}

特點:在系統載入的時候就會對例項物件進行建立

問題:執行緒安全,但是浪費了記憶體空間

package com.anran.example.singleton;

public class starvingmode

public static starvingmode getinstance()

}

描述:對例項物件進行加鎖操作和原子操作,保證多執行緒在建立物件時阻塞

特點:做到了執行緒安全,延遲初始化,並且多執行緒併發時高效

volatile :保證建立物件時jvm的底層操作不會出現指令重新排序,從而保證第二個執行緒判斷例項物件是否建立時的準確性

package com.anran.example.singleton;

public class doublecheckmodel

public doublecheckmodel getinstance()}}

return doublecheckmodel;

}}

描述:在獲取 例項物件的時候,虛擬機器才去載入靜態內部類並初始化,此時只有乙個執行緒可以獲得物件的初始化鎖,其他執行緒無法進行初始化,保證物件的唯一性

特點:執行緒安全,延遲載入

package com.anran.example.singleton;

public class staticclassmode

public static staticclassmode getinstance()

private static class inner

}

特點:列舉類隱藏了私有的構造器,列舉類的域 是相應型別的乙個例項物件

package com.anran.example.singleton;

public enum enummode

}

保證物件建立在jvm中的執行過程中不會指令重新排序(原子操作)

jvm在建立物件的時候大致可以概括為(分配記憶體空間,初始化物件,外部引用指向記憶體空間),但在jvm實際執行的時候可能因為指令重新排序變成(分配記憶體空間,外部引用指向記憶體位址,初始化物件),此時可能導致物件沒有建立完成就被後續程式使用,導致未知異常。

設計模式 單例模式

單例模式 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的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...