国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

單例模式探究

2019-11-08 01:58:02
字體:
來源:轉載
供稿:網友

單例模式的五種寫法: 懶漢 惡漢 靜態內部類 枚舉 雙重校驗鎖

1.懶漢

class LazySingleton{ PRivate static LazySingleton singleton; private LazySingleton(){ } public static LazySingleton getInstance(){ if(singleton==null){ singleton=new LazySingleton(); } return singleton; } }

常用的寫法。問題:沒有考慮線程安全問題,它是線程不安全的,并發環境下很可能出現多個Singleton實例

2.餓漢

class HungrySingleton{ private static HungrySingleton singleton=new HungrySingleton(); private HungrySingleton(){} public static HungrySingleton getInstance(){ return singleton; }}

在類初始化時,已經自行實例化,缺點:沒有達到懶加載的效果

3.靜態內部類

class InternalSingleton{ private static class SingletonHolder{ private final static InternalSingleton INSTANCE=new InternalSingleton(); } private InternalSingleton(){} public static InternalSingleton getInstance(){ return SingletonHolder.INSTANCE; }}

優點:加載時不會初始化靜態變量INSTANCE,因為沒有主動使用,達到Lazy loading。既實現了線程安全,又避免了同步帶來的性能影響

4.枚舉

public enum Singleton { INSTANCE; private String name; public String getName(){ return name; } public void setName(String name){ this.name = name; }}

《Effective java》作者推薦使用的方法,優點:不僅能避免多線程同步問題,而且還能防止反序列化重新創建新的對象。 雖然Effective Java中推薦使用,但是在Android平臺上卻是不被推薦的。在這篇Android Training中明確指出: Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.

5.雙重校驗鎖

class LockSingleton{ private volatile static LockSingleton singleton; private LockSingleton(){} //詳見:http://www.ibm.com/developerworks/cn/java/j-dcl.html public static LockSingleton getInstance(){ if(singleton==null){ synchronized(LockSingleton.class){ if(singleton==null){ singleton=new LockSingleton(); } } } return singleton; }}

它在當前的內存模型中無效。 可以看到里面加了volatile關鍵字來聲明單例對象。它有兩層語義。 第一層,可見性。指的是在一個線程中對該變量的修改會馬上由工作內存(Work Memory)寫回主內存(Main Memory),所以會馬上反應在其它線程的讀取操作中。 第二層語義是禁止指令重排序優化。由于編譯器優化,在實際執行的時候可能與我們編寫的順序不同。編譯器只保證程序執行結果與源代碼相同,卻不保證實際指令的順序與源代碼相同。 既然已經起到了多線程下原子性、有序性、可見性的作用, 雙重檢測鎖定失敗的問題并不歸咎于 JVM 中的實現 bug,而是歸咎于 Java 平臺內存模型。內存模型允許所謂的“無序寫入”,這也是失敗的一個主要原因。 還有疑問可參考http://www.iteye.com/topic/652440 和http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

參考: http://www.oschina.net/code/snippet_107039_6062 http://blog.csdn.net/jason0539/article/details/23297037 http://www.cnblogs.com/andy-zhou/p/5363585.html#_caption_5


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洪湖市| 宜良县| 集贤县| 新蔡县| 通辽市| 苍山县| 榕江县| 印江| 斗六市| 涿州市| 大厂| 宁陵县| 赣州市| 武义县| 凉城县| 西昌市| 修水县| 丹东市| 雷山县| 盐山县| 宾阳县| 桑植县| 收藏| 湘潭县| 冀州市| 嘉定区| 电白县| 内江市| 台北县| 昔阳县| 浠水县| 乐至县| 普安县| 清原| 西盟| 百色市| 大丰市| 正镶白旗| 临洮县| 庆云县| 清涧县|