單例模式,是一種常用的軟體設計模式。單例物件的類必須保證只有乙個例項存在。很多時候我們只需要乙個全域性物件,可以避免多個物件占用記憶體資源,也可以方便我們管理一些配置資訊。通常我們用getinstance來獲取該物件單例例項
對單例的實現,有兩種構建方式:
先來看一下懶漢式單例的實現方式。
public
class single
public
static single getinstance() }}
return instance;
}}
kotlin方式
public doublechecksingleton private
constructor
}}
指令重排:計算機為了提高執行效率,會做的一些優化,在不影響最終結果的情況下,可能會對一些語句的執行順序進行調整
volatile :禁止指令重排,在它的賦值完成之前,不會呼叫讀操作
synchronized 同步鎖:會強制除當前之外的所有執行緒等待,實際上會對程式的執行效率造成負面影響
private:構造器改為私有的,這樣能夠防止被外部的類呼叫
注意其中有兩次if (instance == null)的判斷,這個叫做『雙重檢查 double-check』:
* 第乙個if (instance == null),其實是為了解決效率問題,只有instance為null的時候,才進入synchronized的**段——大大減少了機率。
* 第二個if (instance == null),是為了防止可能出現多個例項的情況。
餓漢式單例的實現方式。
public
class single
public
static single getinstance()
}
kotlin方式
餓漢式在kotlin中,只需要乙個object修飾符就行了,這就是kotlin非常厲害的地方。
object
basesingleton
對於餓漢式來說,能避免多執行緒情況,但是它的例項是在類載入的時候就建立了
缺點:
1.可能由於初始化的太早,造成資源的浪費
2.如果初始化本身依賴於一些其他資料,那麼也就很難保證其他資料會在它初始化之前準備好。
public
class singleton
private
singleton (){}
public
static singleton getinstance()
}
kotlin方式
public innerstarticsingleton private
constructor
private
object
holder
}
public
class test
static
int num = 4; //2.第二步,靜態變數和靜態**塊的載入順序由編寫先後決定
int a = 5; //6.第六步,按照順序載入變數
test()
static
static
void run() // 靜態方法,呼叫的時候才載入// 注意看,e沒有載入
}
java單例模式
第一種方法 public class singleton private static singleton singleton new singleton public static singleton getinstance 第二種方法 public class singleton private...
Java 單例模式
單例模式特點 1 單例類只能有乙個例項。2 單例類必須自己自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。一 餓漢式單例 基於classloder機制避免了多執行緒的同步問題,使用較多 public class singleton 這裡提供了乙個供外部訪問本class的靜態方法,可...
Java單例模式
單例模式的意圖是為了確保乙個類有且僅有乙個例項,並為它提供乙個全域性訪問點。單例模式通過隱藏建構函式,提供物件建立的唯一入口點,從而將類的職責集中在類的單個例項中。design patterns一書中把單例模式歸類為 建立型 模式,意圖是在表明單例物件承擔了其他物件所要依賴的職責。單例模式的優點 在...