當我們有時候需要某個類的唯一例項的時候,就會用到單例模式,單例模式很簡單但是單例模式的在多執行緒情況下的使用卻是值得考慮的。
1.懶載入單例
某些時候初始化的代價可能比較大,因而我們只有在用到某個類的例項的時候才會去初始化類,這種載入行為被稱為懶載入。
**片段a:
package singleton.lazy;
/** * description: 延遲初始化非執行緒安全單例模式
* * @author yunqiangdi
* @version 1.0
* @since 2017-08-22 4:27 pm
*/public class unsafesingleton
public static unsafesingleton getinstance()
}
這段**段**在多執行緒環境下很容易產生兩個例項,因為執行緒a和執行緒b可能同時會進入if條件語句並判斷為false之後,執行緒a 和執行緒b都會new出乙個物件。
**片段b:
package singleton.lazy;
/** * description: 延遲初始化執行緒安全單例模式
* * @author yunqiangdi
* @version 1.0
* @since 2017-08-22 4:44 pm
*/public class safesingleton
public synchronized static safesingleton getinstance()
}
**片段b在獲取例項的方法上加了同步,這種方式如果沒有多個執行緒頻繁呼叫,這種方式是執行緒安全的且合理的。
**片段c:
package singleton.lazy;
/** * description: 延遲初始化佔位
* * @author yunqiangdi
* @version 1.0
* @since 2017-08-22 4:49 pm
*/public class singletonbean
public static singletonbean getinstance()
}
**片段c使用了一種延遲初始化佔位技術用來產生單例,jvm會延遲holder的初始化操作,知道開始使用這個類才會初始化,由於holder使用了靜態初始化,因此避免了同步產生的消耗。
**片段d:
package singleton.lazy;
/** * description: 非執行緒安全雙重加鎖初始化單例
* * @author yunqiangdi
* @version 1.0
* @since 2017-08-22 4:55 pm
*/public class dclsingleton
}return instance;
}}
2.非懶載入單例
package singleton.nolazy;
/** * description: 非懶載入模式的單例
* * @author yunqiangdi
* @version 1.0
* @since 2017-08-22 5:02 pm
*/public class unlazysingleton
public static unlazysingleton getinstance()
}
如果乙個單例類在載入到jvm階段已經被初始化了,由static關鍵字保證,這種單例天生就是執行緒安全的。
package singleton.enums;
/** * description:列舉型單例
* * @author yunqiangdi
* @version 1.0
* @since 2017-08-22 5:12 pm
*/public enum singletonenum
這種建立單例模式的好處是**較少,建立列舉類本身就是執行緒安全的,而且相對於實現了序列化的介面來說,其他單例實現的模式會在反序列化的時候生成不一樣的例項,而這種方式的就不會。
Java設計模式 單例模式(single)
目錄目的 應用例項 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。菜鳥教程 乙個國家有乙個首都 windows 是多程序多執行緒的,在操作乙個檔案的時候,就不可避免地出現多個程序或執行緒同時操作乙個檔案的現象,所以所有檔案的處理必須通過唯一的例項來進行。第一種 package com.ga...
設計模式之單例模式
前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...
設計模式之單例模式
package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...