單例如何建立,你知道幾種形式?

2021-10-09 15:17:14 字數 3666 閱讀 7279

「單例如何建立,你知道幾種形式?」面試官鬼魅一笑……

還好我想起來了看過的那本「寶典」!

懶漢式關於**中單例的建立,子涵先生總結了6種常見的方式。

// 使用public方法直接暴露

public

static singleton1 getinstance()

}

/**

* 推薦

*/public

enum singletonenum

/**

* 基於外部配置的單例

*/public

class

singletonstaticblock

catch

(ioexception e)

instance =

newsingletonstaticblock

(por.

getproperty

("hello"))

;}private

singletonstaticblock

(string info)

public string getinfo()

public

void

setinfo

(string info)

}

resource下增加檔案single.properties

hello = mr.zihan
接下來我們測試一下~

@test

public

void

testsingleton()

測試結果:

instance

com.dwlijx.pattern.creation.single.singleton1@eec5a4a

mr.zihan

延遲建立物件。

要點:

public

class

singletonlazy

public

static singletonlazy getinstance()

return instance;

}}

缺點:執行緒不安全,適用於單執行緒場景。

測試一下:

可能需要多試幾次。

/**

* 懶漢模式

* 用兩個執行緒getinstance,比對一下例項的hashcode

*/@test

public

void

securitytest()

throws executionexception, interruptedexception };

executorservice es = executors.

newfixedthreadpool(2

);future

f1 = es.

submit

(callabletask)

; future

f2 = es.

submit

(callabletask)

; system.out.

println

(f1.

get().

hashcode()

);system.out.

println

(f2.

get().

hashcode()

);es.

shutdown()

;}

1316864772

1685232414

在上乙個例子基礎上增加了控制多執行緒安全的手段。

public

class

singletonlazysafe

public

static singletonlazysafe getinstance()

}}return instance;

}}

測試一下

1316864772

1316864772

那麼問題來了,你知道為啥每次初始化,hashcode都是相同的值嗎?比如1316864772

(1)構造器私有化

(2)內部類的靜態變數儲存唯一例項;

利用了內部類的載入特性:內部類不會自動隨著外部類的載入和初始化而初始化,而是單獨去載入和初始化的。

public

class

innerclasslazysingleton

public

static

class

inner

public

static innerclasslazysingleton getinstance()

}

測試一下

/**

* 懶漢模式-解決執行緒安全問題

* 用兩個執行緒getinstance,比對一下例項的hashcode

*/@test

public

void

innerclasssingletonsafetest()

throws executionexception, interruptedexception };

executorservice es = executors.

newfixedthreadpool(2

);future

f1 = es.

submit

(callabletask)

; future

f2 = es.

submit

(callabletask)

; system.out.

println

(f1.

get().

hashcode()

);system.out.

println

(f2.

get().

hashcode()

);es.

shutdown()

;}

測試結果:

springboot 單例 如何實現乙個單例及優化

社長,乙個愛學習,愛分享的程式猿,始終相信,付出總會有回報的。知識改變命運,學習成就未來。愛拼才會贏 star https github.com itfqyd cxyxs面試官隔壁小王 自我介紹一下 社長 面試官,您好!我叫社長 面試官隔壁小王 你說說如何實現乙個單例?都有幾種實現方式 社長 我知道...

3個Spring Boot核心註解,你知道幾個?

spring boot 核心註解講解 spring boot 最大的特點是無需 xml 配置檔案,能自動掃瞄包路徑裝載並注入物件,並能做到根據 classpath 下的 jar 包自動配置。所以 spring boot 最核心的 3 個註解就是 1 configuration org.springf...

1316 你能知道這是幾進製數?

有個比較特別的隨機數生成器,你輸入乙個十進位制數n,他會生成乙個0到n 1之間的m進製數,但是你不知道這是乙個m進製數,問你能猜測這是幾進製數,公升序輸出所有的可能?第一行乙個n 1 n 10 9 代表輸入的十進位制數,第二行是乙個小於10位的數 字串表示 每個數字由0 9,a z,a z表示0 6...