摘要:餓漢模式線程安全,調用效率高,但是不能延時加載這樣做的好處是編寫簡單,但是無法做到延遲創建對象。考慮線程安全的寫法這種寫法考慮了線程安全,將對的判斷以及的部分使用進行加鎖。如此即可從語義上保證這種單例模式寫法是線程安全的。
餓漢模式
線程安全,調用效率高,但是不能延時加載
public class ImageLoader{ private static ImageLoader instance = new ImageLoader; private ImageLoader(){} public static ImageLoader getInstance(){ return instance; } }
這樣做的好處是編寫簡單,但是無法做到延遲創建對象。但是我們很多時候都希望對象可以盡可能地延遲加載,從而減小負載,所以就需要下面的懶漢法:
懶漢模式public class Singleton { private static Singleton singleton = null; private Singleton(){} public static Singleton getSingleton() { if(singleton == null) singleton = new Singleton(); return singleton; } }
這種方法可以實現延時加載,但是有一個致命弱點:線程不安全(可見性,有序性)。如果有兩條線程同時調用getSingleton()方法,就有很大可能導致重復創建對象。
考慮線程安全的寫法public class Singleton { private static volatile Singleton singleton = null; private Singleton(){} public static Singleton getSingleton(){ synchronized (Singleton.class){ if(singleton == null){ singleton = new Singleton(); } } return singleton; } }
這種寫法考慮了線程安全,將對singleton的null判斷以及new的部分使用synchronized進行加鎖。同時,對singleton對象使用volatile關鍵字進行限制,保證其對所有線程的可見性,并且禁止對其進行指令重排序優化。如此即可從語義上保證這種單例模式寫法是線程安全的。注意,這里說的是語義上,實際使用中還是存在小坑的,會在后文寫到。
public class Singleton { private static volatile Singleton singleton = null; private Singleton(){} public static Singleton getSingleton(){ if(singleton == null){ synchronized (Singleton.class){ if(singleton == null){ singleton = new Singleton(); } } } return singleton; } }
這種寫法被稱為“雙重檢查鎖”,顧名思義,就是在getSingleton()方法中,進行兩次null檢查。看似多此一舉,但實際上卻極大提升了并發度,進而提升了性能。為什么可以提高并發度呢?
在單例中new的情況非常少,絕大多數都是可以并行的讀操作。因此在加鎖前多進行一次null檢查就可以減少絕大多數的加鎖操作,執行效率提高的目的也就達到了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77544.html
摘要:結構型模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。行為型模式模版方法模式命令模式迭代器模式觀察者模式中介者模式備忘錄模式解釋器模式模式狀態模式策略模式職責鏈模式責任鏈模式訪問者模式。 主要版本 更新時間 備注 v1.0 2015-08-01 首次發布 v1.1 2018-03-12 增加新技術知識、完善知識體系 v2.0 2019-02-19 結構...
摘要:使用靜態類體現的是基于對象,而使用單例設計模式體現的是面向對象。二編寫單例模式的代碼編寫單例模式的代碼其實很簡單,就分了三步將構造函數私有化在類的內部創建實例提供獲取唯一實例的方法餓漢式根據上面的步驟,我們就可以輕松完成創建單例對象了。 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 本來打算沒那么快更新的,這陣子在刷Spring的書籍。在看...
摘要:單例模式的懶漢實現線程安全通過設置同步方法,效率太低,整個方法被加鎖模擬在創建對象之前做一些準備工作使用上面的測試類,測試結果可以看到,這種方式達到了線程安全。可以說這種方式是實現單例模式的最優解。 1. 什么是單例模式 單例模式指的是在應用整個生命周期內只能存在一個實例。單例模式是一種被廣泛使用的設計模式。他有很多好處,能夠避免實例對象的重復創建,減少創建實例的系統開銷,節省內存。 ...
摘要:基礎問題的的性能及原理之區別詳解備忘筆記深入理解流水線抽象關鍵字修飾符知識點總結必看篇中的關鍵字解析回調機制解讀抽象類與三大特征時間和時間戳的相互轉換為什么要使用內部類對象鎖和類鎖的區別,,優缺點及比較提高篇八詳解內部類單例模式和 Java基礎問題 String的+的性能及原理 java之yield(),sleep(),wait()區別詳解-備忘筆記 深入理解Java Stream流水...
摘要:基礎問題的的性能及原理之區別詳解備忘筆記深入理解流水線抽象關鍵字修飾符知識點總結必看篇中的關鍵字解析回調機制解讀抽象類與三大特征時間和時間戳的相互轉換為什么要使用內部類對象鎖和類鎖的區別,,優缺點及比較提高篇八詳解內部類單例模式和 Java基礎問題 String的+的性能及原理 java之yield(),sleep(),wait()區別詳解-備忘筆記 深入理解Java Stream流水...
閱讀 885·2021-10-27 14:19
閱讀 1102·2021-10-15 09:42
閱讀 1525·2021-09-14 18:02
閱讀 737·2019-08-30 13:09
閱讀 2981·2019-08-29 15:08
閱讀 2081·2019-08-28 18:05
閱讀 948·2019-08-26 10:25
閱讀 2777·2019-08-23 16:28