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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

在Java中对Singleton类进行双重检查锁定

發(fā)布時間:2023/12/3 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Java中对Singleton类进行双重检查锁定 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Singleton類在Java開發(fā)人員中非常常見,但是它給初級開發(fā)人員帶來了許多挑戰(zhàn)。 他們面臨的主要挑戰(zhàn)之一是如何使Singleton保持為Singleton? 也就是說,無論出于何種原因,如何防止單個實例的多個實例。 對Singleton進行雙重檢查鎖定是一種確保在應用程序生命周期中僅創(chuàng)建Singleton類的一個實例的方法。 顧名思義,在雙重檢查鎖定中,代碼對一個Singleton類的現(xiàn)有實例進行兩次檢查(有和沒有鎖定以進行兩次檢查),以確保不會創(chuàng)建一個以上的singleton實例。 順便說一句,它在Java修復JDK 1.5中的內存模型問題之前就被打破了。 在本文中,我們將看到如何在Java中為Singleton的雙重檢查鎖定編寫代碼 ,為什么在Java 5之前雙重檢查鎖定被破壞以及如何解決。 順便說一句,從訪談的角度來看,這也很重要,我聽說有人要求對金融和服務業(yè)的公司進行手工雙重檢查Singleton鎖定的代碼,并相信我很棘手,直到您清楚地了解了什么你在做。 您也可以查看我的Singleton設計模式問題的完整列表,以進行良好的準備。

Singleton類破壞其合同的一種常見情況是多線程。 如果您要求初學者為Singleton設計模式編寫代碼,那么他很有可能會提出以下內容:

private static Singleton _instance;public static Singleton getInstance() {if (_instance == null) {_instance = new Singleton();}return _instance; }

并且當您指出這段代碼將由多個線程并行調用時,將創(chuàng)建Singleton類的多個實例時,他可能會使整個getInstance()方法同步化 ,如第二個代碼示例getInstanceTS()方法所示。 盡管它是線程安全的,可以解決多個實例的問題,但效率不是很高。 每次調用此方法時,都需要承擔同步的費用,而創(chuàng)建Singleton實例時,僅在第一類上才需要同步。 這將使我們進入雙重檢查的鎖定模式 ,其中只有關鍵的代碼段被鎖定。 程序員稱其為“雙重檢查鎖定”,因為對_instance == null進行了兩次檢查,一次沒有鎖定,而另一次則帶有鎖定(內部同步)塊。 這是Java中經(jīng)過雙重檢查的鎖定的樣子:

public static Singleton getInstanceDC() {if (_instance == null) { // Single Checkedsynchronized (Singleton.class) {if (_instance == null) { // Double checked_instance = new Singleton();}}}return _instance; }


從表面上看,這種方法看起來很完美,因為您只需要為同步塊支付一次費用,但是在使_instance變量volatile之前,它仍然無效。 如果沒有volatile修飾符,則Java中的另一個線程可能會看到_instance變量的一半初始化狀態(tài),但是由于volatile變量保證了before-before關系的發(fā)生,所有寫入都會在_instance變量的任何讀取之前發(fā)生在volatile _instance上。 在Java 5之前不是這種情況,這就是為什么以前雙重檢查鎖定已被破壞的原因。 現(xiàn)在,有了事前保證 ,您可以放心地認為這將起作用。 順便說一下,這不是創(chuàng)建線程安全的Singleton的最佳方法,您可以將Enum用作Singleton ,它在實例創(chuàng)建期間提供內置的線程安全性。 另一種方法是使用靜態(tài)持有人模式。

/** A journey to write double checked locking of Singleton class in Java.*/class Singleton {private volatile static Singleton _instance;private Singleton() {// preventing Singleton object instantiation from outside}/** 1st version: creates multiple instance if two thread access* this method simultaneously*/public static Singleton getInstance() {if (_instance == null) {_instance = new Singleton();}return _instance;}/** 2nd version : this definitely thread-safe and only* creates one instance of Singleton on concurrent environment* but unnecessarily expensive due to cost of synchronization* at every call.*/public static synchronized Singleton getInstanceTS() {if (_instance == null) {_instance = new Singleton();}return _instance;}/** 3rd version : An implementation of double checked locking of Singleton.* Intention is to minimize cost of synchronization and improve performance,* by only locking critical section of code, the code which createsinstance of Singleton class.* By the way this is still broken, if we don't make _instance volatile,as another thread can* see a half initialized instance of Singleton.*/public static Singleton getInstanceDC() {if (_instance == null) {synchronized (Singleton.class) {if (_instance == null) {_instance = new Singleton();}}}return _instance;} }

這就是Java中對Singleton類的雙重檢查鎖定 。 這是在Java中創(chuàng)建線程安全的Singleton的有爭議的方法之一,就將Enum用作Singleton類而言,還有其他更簡單的選擇。 我不建議您像那樣實現(xiàn)Singleton,因為有許多更好的方法可以在Java中實現(xiàn)Singleton模式。 但是,這個問題具有歷史意義,并且還教導了并發(fā)如何引入細微的錯誤。 正如我之前所說,從訪談的角度來看,這非常重要。 在進行任何Java面試之前,練習手動編寫Singleton類的雙重檢查鎖定。 這將使您深入了解Java程序員的編碼錯誤。 與此相關的是,在現(xiàn)代的測試驅動開發(fā)中,由于Singleton難以模擬其行為,因此Singleton被視為反模式,因此,如果您是TDD實踐者,最好避免使用Singleton模式。

翻譯自: https://www.javacodegeeks.com/2014/05/double-checked-locking-on-singleton-class-in-java.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結

以上是生活随笔為你收集整理的在Java中对Singleton类进行双重检查锁定的全部內容,希望文章能夠幫你解決所遇到的問題。

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