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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JAVA 双重检查锁定和延迟初始化

發布時間:2025/5/22 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA 双重检查锁定和延迟初始化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

雙重檢查鎖定的由來
在Java程序中,有時需要推遲一些高開銷的對象的初始化操作,并且只有在真正使用到這個對象的時候,才進行初始化,此時,就需要延遲初始化技術。
延遲初始化的正確實現是需要一些技巧的,否則容易出現問題,下面一一介紹。

方案1

public class UnsafeLazyInit{ private static Instance instance; public static Instance getInstance(){ if (instance == null){ instance = new Instance(); } return instance; } }

這種做法的錯誤是很明顯的,如果兩個線程分別調用getInstance,由于對共享變量的訪問沒有做同步,很容易出現下面兩種情況:
1.線程A和B都看到instance沒有初始化,于是分別進行了初始化。
2.instance=new Instance操作被重排序,實際執行過程可能是:先分配內存,然后賦值給instance,最后再執行初始化。
如果是這樣的話,其他線程可能就會讀取到尚未初始化完成的instance對象。

方案2

public class UnsafeLazyInit{ private static Instance instance; public static synchronized Instance getInstance(){ if (instance == null){ instance = new Instance(); } return instance; } }

這種做法的問題是很明顯的,每一次讀取instance都需要同步,可能會對性能產生較大的影響。

方案3

方案3是一個錯誤的雙重檢測加鎖實現,看代碼:

public class UnsafeLazyInit{ private static Instance instance; public static Instance getInstance(){ if (instance == null){ synchronized(UnsafeLazyInit.classs){ if (instance == null){ instance = new Instance(); } } } return instance; } }

這種方案看似解決了上面兩種方案都存在的問題,但是也是有問題的。

問題根源

instance = new Instance();

這一條語句在實際執行中,可能會被拆分程三條語句,如下:

memory = allocate(); ctorInstance(memory); //2 instance = memory; //3

根據重排序規則,后兩條語句不存在數據依賴,因此是可以進行重排序的。
重排序之后,就意味著,instance域在被賦值了之后,指向的對象可能尚未初始化完成,而instance域是一個靜態域,
可以被其他線程讀取到,那么其他線程就可以讀取到尚未初始化完成的instance域。

基于volatile的解決方案

要解決這個辦法,只需要禁止語句2和語句3進行重排序即可,因此可以使用volatile來修改instance就能做到了。

private volatile static Instance instance;

因為Volatile語義會禁止編譯器將volatile寫之前的操作重排序到volatile之后。

基于類初始化的解決方案

Java語言規范規定,對于每一個類或者接口C ,都有一個唯一的初始化鎖LC與之對應,從C到LC的映射,由JVM實現。
每個線程在讀取一個類的信息時,如果此類尚未初始化,則嘗試獲取LC去初始化,如果獲取失敗則等待其他線程釋放LC。
如果能獲取到LC,則要判斷類的初始化狀態,如果是位初始化,則要進行初始化。如果是正在初始化,
則要等待其他線程初始化完成,如果是已經初始化,則直接使用此類對象。

public class InstanceFactory {private static class InstanceHolder {public static Instance instance = new Instance();}public static Instance getInstance() {return InstanceHolder.instance ; //這里將導致InstanceHolder類被初始化 } }

結論

字段延遲初始化降低了初始化類或者創建實例的開銷,但是增加零訪問被延遲促使化的字段的開銷。
在大部分時候,正常的初始化要優于延遲初始化。如果確實需要對實例字段使用線程安全的延遲初始化,
請使用上面介紹的基于volatile的延遲初始化方案;如果確實需要對靜態字段使用線程安全的延遲初始化,
請使用上面基于類初始化方案的延遲初始化。

轉載于:https://www.cnblogs.com/rinack/p/6066847.html

總結

以上是生活随笔為你收集整理的JAVA 双重检查锁定和延迟初始化的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 久久av一区二区三 | 亚洲高清中文字幕 | 欧美日韩亚洲一区二区 | 久草视频精品 | 欧美激情黑人 | 精射女上司| 欧美一区二区三区精品 | 久久人妻少妇嫩草av蜜桃 | 一级黄色短片 | 日韩美女av在线 | 亚洲美女黄色片 | 91小宝寻花一区二区三区 | 久久精品视频在线 | av电影在线观看网址 | 永久免费成人 | 国产在线视频你懂的 | 亚洲一区二区视频在线 | 亚洲男人第一天堂 | 成年人在线观看视频免费 | 三级黄色在线视频 | 人人妻一区二区三区 | 欧美少妇xxxxx | 日韩成人一区二区视频 | 18岁成年人网站 | 欧美另类在线视频 | 日韩在线1| 极品美女av | 成人无高清96免费 | 国产偷v国产偷v亚洲高清 | www日本在线观看 | 麻豆网站在线播放 | 国产新婚疯狂做爰视频 | 日韩久久精品视频 | 久久久久久久久久亚洲 | 色玖玖 | 99视频国产精品 | 国产一区二区三区四区在线观看 | 欧美激情一区在线 | 激情春色网 | 国产精品无码在线 | 麻豆精品国产 | 午夜免费福利在线 | 美女被草视频在线观看 | 蜜桃视频污在线观看 | 区一区二视频 | 曰韩在线 | 欧洲亚洲女同hd | 一卡二卡精品 | 欧美色图综合网 | 日日摸日日碰夜夜爽av | 97干干干 | 激情免费av | 亚洲天堂精品在线 | 野外(巨肉高h) | 黄色三级av | 久久亚洲精华国产精华液 | 爽妇综合网 | 精品欧美一区二区在线观看 | 日韩精品一区二区在线 | 成年人免费看毛片 | 欧美丰满美乳xxx高潮www | 先锋影音色| 青青久视频 | 在线观看国产日韩 | 国产三级第一页 | 久久久全国免费视频 | 国产精品久久久久久久免费大片 | av免费观看网站 | 欧美成人手机在线视频 | 调教在线观看 | 成人开心网| 国产又色又爽又黄 | 日韩精品中文字幕一区 | 欧美放荡办公室videos4k | 国产日韩欧美精品一区二区 | 黄色永久网站 | 中文字幕在线观 | 91精品中文字幕 | 女久久| 亚洲 欧美 精品 | 国产强被迫伦姧在线观看无码 | 欧美粉嫩videosex极品 | 灌篮高手全国大赛电影 | 亚洲第6页 | 五月依人网 | 秋霞欧美一区二区三区视频免费 | 奇米色777 | 亚洲精品7777 | 91video| 老色批永久免费网站www | 国产精品尤物 | 国产豆花视频 | 午夜小网站 | 一区二区在线免费观看 | 精品成在人线av无码免费看 | 久久伊人影视 | 久久草精品 | 91黄色免费看 | 国内成人免费视频 |