設計模式之單例模式

2021-10-16 17:42:25 字數 1948 閱讀 2315

餓漢式顧名思義,不管你需不需要,只要你引用了該類,就會建立物件的例項。

*  經典的餓漢式單例模式 *[

/10 上午9:17

*/public

class

singleton

public

static singleton getsingleton()

}

but … 上述寫法無法做到lazy load(延遲載入),lazy load意思就是我在需要的時候才去建立例項。於是我們可以使用如下寫法:

/**

* 保證lazy load的單例模式,懶漢式單例

* @author wushuaiping

* @date 2018/3/10 上午9:17

*/public

class

singleton

public

static singleton getsingleton()

}}

but… 上述寫法無法保證執行緒安全性,如果在單執行緒環境下,上述寫法,就不會出現建立重複的物件的情況,但是如果在多執行緒情況下,有多條執行緒同時呼叫了getsingleton()方法,那麼極有可能建立出多餘且重複的物件。那麼此時想到的解決方案是對**塊或者方法加入同步鎖,保證執行緒安全,於是我們可以這樣寫

/**

* 保證lazy load並且保證執行緒安全的單例模式,懶漢式單例

* @author wushuaiping

* @date 2018/3/10 上午9:17

*/public

class

singleton

public

static

synchronized singleton getsingleton()

}}

/**

* 保證lazy load並且保證執行緒安全的單例模式,懶漢式單例

* @author wushuaiping

* @date 2018/3/10 上午9:17

*/public

class

singleton

public

static singleton getsingleton()

}return singleton;

}}

but… 通過上述寫法,我們雖然保證了執行緒安全,但是我們**的效率卻降低了,why? 因為我們使用了synchronized啊,當乙個執行緒進入synchronized修飾的方法或者**塊後,其他執行緒必須在後面排隊,導致了**的效率的降低,於是我們可以使用duoble-check來繼續優化**:

/**

* 保證lazy load並且保證執行緒安全還兼顧了效率的單例模式,懶漢式單例

* @author wushuaiping

* @date 2018/3/10 上午9:17

*/public

class

singleton

public

static singleton getsingleton()

}}return singleton;

}}

該方式為什麼能保證效率呢?我們寫懶漢式單例的原因是,我們不想要在jvm載入類的時候就建立物件,而是在我們需要該物件的時候才去建立物件,所以我們想到了懶漢式單例模式,而正是因為懶漢式單例模式的特性,通過duoble-check,每個執行緒經過第乙個if(singleton == null)的時候,基本都會因為之前已經建立過了該物件,而直接返回,所以,該方式效率得到了保證。

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會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...