設計模式之單例模式

2021-08-01 13:03:16 字數 2041 閱讀 1881

該類只能有乙個例項;

該類能夠自動例項化;

對整個系統可見,即必須向整個系統提供這個例項。

public

class singleton

public

static singleton getinstance()

}

實現簡單,基於classloder機制避免了多執行緒的同步問題,不過,instance在類裝載時就例項化,沒有進行延遲載入。

public

class singleton

public

static singleton getinstance()

return instance;

} }

lazy loading很明顯,但是在多執行緒時不能正常工作

public

class singleton

public

static synchronized singleton getinstance()

return instance;

} }

解決了多執行緒同步,但同步範圍太大,在例項化instacne後,獲取例項仍然是同步的,效率低

public

class singleton

public

static singleton getinstance()

} return instance;

} }

縮小了同步範圍,但存在建立多個例項的可能,比如執行緒a和b同時執行到了synchronized(singleton.class),執行緒b獲得鎖執行完之後,執行緒a獲得鎖,但是此時沒有檢查singleton是否為空就直接執行了,所以還會出現兩個singleton例項的情況

public

class singleton

public

static singleton getinstance()

} }

return instance;

} }

instance=new singleton()並不是原子語句,實際包括了下面三大步驟:

1. 為物件分配記憶體

2. 初始化例項物件

3. 把引用instance指向分配的記憶體空間

處理器會進行指令重排序優化,當重排後執行順序為1,3,2時,若執行緒1執行到3,此時執行緒2判斷instance!=null,直接返回instance引用,但實際上例項物件還沒有初始化完畢,使用它可能會造成程式崩潰。

public

class singleton

public

static singleton getinstance()

} }

return instance;

} }

使用volatile提供記憶體屏障,限制處理器進行指令優化重排,保證了instance賦值操作是最後一步完成,不會再出現instance在物件沒有初始化時就不為null的情況

public

class singleton

public

static singleton getinstance()

static class instanceholder

}

靜態內部類在singleton類被裝載時並不會立即例項化,而是在呼叫getinstance方法,才會裝載singletoninstance類,從而完成singleton的例項化。

類的靜態屬性只會在第一次載入類的時候初始化,所以在這裡,jvm幫助我們保證了執行緒的安全性,在類進行初始化時,別的執行緒是無法進入的。

public

enum easysingleton

借助jdk1.5中新增的列舉來實現單例模式。不僅能避免多執行緒同步問題,而且還能防止反序列化重新建立新的物件。

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...