一個小的技術細節
在學習過之前的《單例》之後,相信大家一定對單例有了很深的理解,對於雙重校驗鎖的單例實現大家一定都不陌生。
不知道大家有沒有關注過一個細節,那就是在雙重校驗鎖中的getInstance方法中,定義了一個區域性變數來接收Singleton的單例物件。程式碼實現如下:
public
class
Singleton
{
private
static volatile Singleton instance
=
null
;
private
Singleton
(
)
{
}
public
static Singleton
getInstance
(
)
{
Singleton temp
=instance
;
// 定義了一個區域性變數
if
(
null
== temp
)
{
//對區域性變數進行非空判斷
synchronized
(
Singleton
.class
)
{
temp
= instance
;
if
(
null
== temp
)
{
temp
=
new
Singleton
(
)
;
//對區域性變數進行賦值
instance
=temp
;
//再將區域性變數賦值給單例物件
}
}
}
return instance
;
//返回單例物件
}
}
以上,便是一個雙重校驗鎖的程式碼,可以看到,在getInstance方法中定義了一個區域性變數temp,在操作過程中都是對這個臨時的區域性變數進行的操作,最後再賦值給真正的單例物件的。
在很多原始碼中,也都有類似的做法,如Spring中有以下程式碼:
private
static volatile ReactiveAdapterRegistry sharedInstance
;
public
static ReactiveAdapterRegistry
getSharedInstance
(
)
{
//vx耗:mbz_java_panlong 十年開發經驗程式設計師,免費解答,備註“MI”即可
ReactiveAdapterRegistry registry
= sharedInstance
;
if
(registry
==
null
)
{
synchronized
(
ReactiveAdapterRegistry
.class
)
{
registry
= sharedInstance
;
if
(registry
==
null
)
{
registry
=
new
ReactiveAdapterRegistry
(
)
;
sharedInstance
= registry
;
}
}
}
return registry
;
}
那麼,你知道為什麼要這麼做嗎?
這裡其實和volatile有關,我們知道,雙重校驗鎖單例為了避免發生指令重排,一定要使用volatile來定義單例物件。
其實如果大家對於volatile有深入理解的話,這個問題其實不難回答。為了保證共享變數在併發場景下的記憶體可見性,volatile變數的操作前後都會通過插入記憶體屏障來進行資料同步,即將執行緒的本地記憶體資料同步到主記憶體(或從主記憶體將資料同步到執行緒的本地記憶體)
而這個過程其實是有很大的損耗的,我們可以想辦法降低對於volatile變數的訪問次數,那就是通過定義區域性變數的方式。
因為區域性變數並不是共享的,所以不需要進行執行緒本地記憶體和主存之間的資料同步,操作效率就會很高。
所以,使用區域性變數,是一種效能提升的方式,可以減少主存與執行緒記憶體的拷貝次數。
(全文完)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010294/viewspace-2847955/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 重溫Java Web的技術細節JavaWeb
- Amazon Corretto技術細節探祕
- 小細節
- Laravel 的一個命名細節分享Laravel
- 思考一個小細節,從如何反轉字典說起
- 深入解讀Service Mesh 背後的技術細節
- “我是技術總監,你幹嘛總問我技術細節?”
- ChatGPT資料洩露,技術細節公佈ChatGPT
- Vue、Javascript小細節VueJavaScript
- 拋開技術細節,分享五年職場的個人感悟及道理總結
- [譯] Airbnb 在 React Native 上下的賭注(二):技術細節AIReact Native
- 機器級程式的小細節
- 『技術分享』—— 我的第一個微信小程式-趣聞微信小程式
- 從零帶你入門stylegan~stylegan3的技術細節
- 分投趣(Fintoch)系統技術開發細節分析
- 看FCOS時的小細節總結
- 一個小程式開發者的技術之路 | 2018掘金年度徵文
- 解讀 AI 引擎 MindSpore 開發實踐與技術細節AI
- 精讀《為什麼專家不再關心技術細節》
- Docker 19.03.13的四個使用細節Docker
- TCP 中的兩個細節點TCP
- [20200409]使用ash_wait_chains注意的一個細節.txtAI
- 關於 SAPGUI 事物碼在 Fiori Launchpad 中嵌入執行的技術細節GUI
- 那些令人細思恐極的AI技術,哪一個戳中你的命門?AI
- 技術戰疫:下一個10年的技術趨勢
- 一個20年技術老兵的 2020 年度技術總結
- BSEX交易所繫統技術開發詳情(細節分析)
- Node 中如何引入一個模組及其細節
- 雲原生平臺 Kyma 上建立的 Lambda Function 的技術實現細節介紹Function
- 關於SVM數學細節邏輯的個人理解(一)
- 一個技術的成長過程
- 一個故事看懂CPU的SIMD技術
- for 迴圈的一些細節
- Termux使用的一些細節UX
- 兩個技術小錯誤會毀掉一場風暴事件事件
- 我為什麼勸你不要過度糾結於技術細節?
- 應用架構之道:分離業務邏輯和技術細節應用架構
- 微軟麻將 AI 論文釋出,首次公開技術細節微軟AI