设计模式:单例模式的写法(基础写法和线程安全写法)
單例模式的寫法非常多。先給出一種最基礎的寫法:
(A種寫法):
package singleton;public class SingletonInstance {private static SingletonInstance mSingletonInstance = null;// 特意將構造函數設置成 private,防止外部使用者new SingletonInstance()。private SingletonInstance() {}public static SingletonInstance getInstance() {if (mSingletonInstance == null) {mSingletonInstance = new SingletonInstance();}return mSingletonInstance;} }A寫法是單例模式最簡單、最基礎、最清晰的寫法。但遺憾的是這樣的寫法是線程不安全的代碼寫法。
假設該類同一時候在并發N多個線程中被訪問被使用、尤其是假設這個類假設涉及到數據庫訪問等等此類線程安全問題敏感的代碼應用場景時,后果將是一場災難。
但單例模式的A種寫法也有其廣泛場景:不要求線程安全,沒有同步需求且效率優先級高的場景中。推薦使用單例模式的A種寫法。
B種寫法(線程安全寫法1):
private SingletonInstance() { } public static synchronized SingletonInstance getInstance() { if (mSingletonInstance == null) { mSingletonInstance = new SingletonInstance(); } return mSingletonInstance; } }
單例模式的B種寫法事實上是在A種寫法的基礎上的改進。要點是添加了同步機制:synchronized。
synchronized ,同步從某種意義上講事實上就是堵塞,堵塞的結果就是隨意時刻,僅僅有一個線程能夠訪問該段同步方法體中的代碼。這樣被synchronized的代碼性能將下降,但達到了線程安全的目的。
B種單例模式的寫法。主要是為了解決線程安全。
變體非常多。變體的目的主要集中在怎樣增強線程安全的操作性。現舉比例如以下,比方:
B種寫法的增強型變體(線程安全寫法2):
package singleton;public class SingletonInstance {// 注意!volatile 也不能全然保證線程安全,后面將寫關于volatile的文章解釋這一點兒。 // volatile僅僅是增強。
private static volatile SingletonInstance mSingletonInstance = null; // 特意將構造函數設置成 private。防止外部使用者new SingletonInstance()。 private SingletonInstance() { } public static SingletonInstance getInstance() { if (mSingletonInstance == null) { // synchronized (SingletonInstance.class)不必鎖住整個方法,僅僅鎖住一塊代碼就可以。 // 和synchronized (this)一樣,但由于是static方法。故無法使用this。才使用XXXClass.class // synchronized的基本使用原則:盡可能不要鎖住大塊大塊代碼(方法體或類),僅僅鎖住必需的一小塊核心、急需同步的代碼段就可以,越少越好,越小越好。 // 要知道,一旦使用synchronized,就意味著代碼性能的開銷 synchronized (SingletonInstance.class) { if (mSingletonInstance == null) mSingletonInstance = new SingletonInstance(); } } return mSingletonInstance; } }
總結
以上是生活随笔為你收集整理的设计模式:单例模式的写法(基础写法和线程安全写法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米路由器如何设置QoS智能限速 小米路
- 下一篇: 开发之路(设计模式二:观察者模式)