日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个小的技术细节

發布時間:2025/3/16 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个小的技术细节 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在學習過之前的《單例》之后,相信大家一定對單例有了很深的理解,對于雙重校驗鎖的單例實現大家一定都不陌生。

不知道大家有沒有關注過一個細節,那就是在雙重校驗鎖中的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()?{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變量的訪問次數,那就是通過定義局部變量的方式。

因為局部變量并不是共享的,所以不需要進行線程本地內存和主存之間的數據同步,操作效率就會很高。

所以,使用局部變量,是一種性能提升的方式,可以減少主存與線程內存的拷貝次數。

有道無術,術可成;有術無道,止于術歡迎大家關注Java之道公眾號 好文章,我在看??

總結

以上是生活随笔為你收集整理的一个小的技术细节的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。