singleton 类_在Java中对Singleton类进行双重检查锁定
singleton 類
Singleton類在Java開發人員中非常常見,但是它給初級開發人員帶來了許多挑戰。 他們面臨的主要挑戰之一是如何使Singleton保持為Singleton? 也就是說,無論出于何種原因,如何防止單個實例的多個實例。 對Singleton進行雙重檢查鎖定是一種確保在應用程序生命周期中僅創建Singleton類的一個實例的方法。 顧名思義,在兩次檢查鎖定中,代碼對一次Singleton類的現有實例進行兩次檢查(不進行雙重鎖定),以確保不會創建一個以上的singleton實例。 順便說一句,它在Java修復JDK 1.5中的內存模型問題之前就被破壞了。 在本文中,我們將看到如何為Java中的Singleton的雙重檢查鎖定編寫代碼 ,為什么在Java 5之前雙重檢查鎖定被破壞以及如何解決。 順便說一句,從訪談的角度來看,這也很重要,我聽說有人要求對金融和服務業的公司進行手工雙重檢查Singleton鎖定的代碼,并相信我很棘手,直到您清楚地了解了什么你在做。 您還可以查看我的Singleton設計模式問題的完整列表,以進行良好的準備。
Singleton類破壞其合同的一種常見情況是多線程。 如果您要求初學者為Singleton設計模式編寫代碼,那么他很有可能會提出以下內容:
private static Singleton _instance;public static Singleton getInstance() {if (_instance == null) {_instance = new Singleton();}return _instance; }并且當您指出這段代碼將由多個線程并行調用時,將創建Singleton類的多個實例時,他可能會使整個getInstance()方法同步化 ,如第二個代碼示例getInstanceTS()方法所示。 盡管它是線程安全的,并且可以解決多個實例的問題,但效率不是很高。 每次調用此方法時,都需要承擔同步的費用,而創建Singleton實例時,僅在第一類上才需要同步。 這將使我們進入雙重檢查的鎖定模式 ,即只有關鍵的代碼段被鎖定。 程序員稱其為“雙重檢查鎖定”,因為對_instance == null進行了兩次檢查,一次沒有鎖定,而另一次則帶有鎖定(內部同步)塊。 這是Java中經過雙重檢查的鎖定的樣子:
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變量的一半初始化狀態,但是由于volatile變量保證了before-before關系的發生,所有寫操作都會在_instance變量的任何讀取之前發生在volatile _instance上。 在Java 5之前不是這種情況,這就是為什么以前雙重檢查鎖定已被破壞的原因。 現在,有了事前保證 ,您可以放心地認為這將起作用。 順便說一下,這不是創建線程安全的Singleton的最佳方法,可以將Enum用作Singleton ,它在實例創建過程中提供內置的線程安全性。 另一種方法是使用靜態持有人模式。
這就是有關Java中Singleton類的雙重檢查鎖定的全部內容。 這是在Java中創建線程安全的Singleton的有爭議的方法之一,就將Enum用作Singleton類而言,還有其他更簡單的選擇。 我不建議您像這樣實現Singleton,因為有許多更好的方法可以在Java中實現Singleton模式。 雖然,這個問題具有歷史意義,并且還教導了并發如何引入細微的錯誤。 正如我之前所說,從訪談的角度來看,這非常重要。 在進行任何Java面試之前,練習手工編寫Singleton類的雙重檢查鎖定。 這將使您深入了解Java程序員的編碼錯誤。 與此相關的是,在現代的測試驅動開發中,由于Singleton難以模擬其行為,因此Singleton被視為反模式,因此,如果您是TDD實踐者,最好避免使用Singleton模式。
翻譯自: https://www.javacodegeeks.com/2014/05/double-checked-locking-on-singleton-class-in-java.html
singleton 類
總結
以上是生活随笔為你收集整理的singleton 类_在Java中对Singleton类进行双重检查锁定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 口罩备案号(囗罩备案)
- 下一篇: 反应型关系数据库事务