一個小的技術細節
在學習過之前的《單例》之後,相信大家一定對單例有了很深的理解,對於雙重校驗鎖的單例實現大家一定都不陌生。
不知道大家有沒有關注過一個細節,那就是在雙重校驗鎖中的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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Google+的一些技術細節Go
- CodePen的CSS技術細節CSS
- 重溫Java Web的技術細節JavaWeb
- Amazon Corretto技術細節探祕
- 揭祕GitHub CSS技術細節GithubCSS
- 小細節
- 由sqlplus中的一個小細節所做的折騰SQL
- Google受攻擊技術細節曝光Go
- Laravel 的一個命名細節分享Laravel
- 開發小細節系列之一
- 你需要注意的Java小細節(一)Java
- 思考一個小細節,從如何反轉字典說起
- 深入解讀Service Mesh 背後的技術細節
- 英特爾首度披露80個核心處理器技術細節
- JS 一些優化效能的小細節JS優化
- 提高javascript效能的小細節JavaScript
- oracle並行的小細節Oracle並行
- Vue、Javascript小細節VueJavaScript
- “我是技術總監,你幹嘛總問我技術細節?”
- ChatGPT資料洩露,技術細節公佈ChatGPT
- 機器級程式的小細節
- 『技術分享』—— 我的第一個微信小程式-趣聞微信小程式
- 看FCOS時的小細節總結
- Vue.js 和 MVVM 的小細節Vue.jsMVVM
- 筆記——Android 中的小細節筆記Android
- 從零帶你入門stylegan~stylegan3的技術細節
- [譯] Airbnb 在 React Native 上下的賭注(二):技術細節AIReact Native
- 微信收費事件背後被廣泛忽略的技術細節事件
- 分投趣(Fintoch)系統技術開發細節分析
- 關於QString轉換為char*的一點小細節
- Node 中如何引入一個模組及其細節
- 解讀 AI 引擎 MindSpore 開發實踐與技術細節AI
- 精讀《為什麼專家不再關心技術細節》
- 一個MapReduce 程式示例 細節決定成敗(一)
- TCP 中的兩個細節點TCP
- 小程式開發所遇的問題以及一些小細節
- 謹贈20篇技術熱文營造一個不一樣的節日氣氛!
- 一個小程式開發者的技術之路 | 2018掘金年度徵文