「單例如何建立,你知道幾種形式?」面試官鬼魅一笑……懶漢式關於**中單例的建立,子涵先生總結了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...