单例模式之懒汉式/饿汉式/结合二者之优的模式
單例模式主要用來產(chǎn)生一個(gè)對(duì)象的具體實(shí)例,它可以確保系統(tǒng)中一個(gè)類只產(chǎn)生一個(gè)實(shí)例。
兩個(gè)好處:
- 對(duì)于頻繁使用的對(duì)象,可以省略new操作花費(fèi)的時(shí)間
- new的次數(shù)少了,對(duì)系統(tǒng)內(nèi)存的使用頻率就小了,那么GC壓力就會(huì)降低,縮短了GC停頓時(shí)間
餓漢式單例模式:
public class Singleton {private Singleton() {System.out.println("Singleton iscreate");}private static Singleton instance = new Singleton();private static Singleton getInstance() {return instance;} }私有化構(gòu)造方法的作用:不能new這個(gè)類的實(shí)例,從而避免該類被錯(cuò)誤的創(chuàng)建
因此要想獲取這個(gè)對(duì)象,只能調(diào)用getInstance()工廠方法,構(gòu)造方法被私有化,要想這個(gè)方法可以被調(diào)用,所以這個(gè)方法必須用static修飾,調(diào)用方式:類.方法名
從而instance也必須用static修飾。
好處:性能非常好,getInstance()方法只是簡(jiǎn)單的返回instance,并沒有任何鎖操作,所以在并行程序中它會(huì)有很好的表現(xiàn)
壞處:Singleton構(gòu)造函數(shù)或者說Singleton實(shí)例在什么時(shí)候創(chuàng)建是不受控制的,對(duì)于靜態(tài)成員instance,它會(huì)在類第一次初始化的時(shí)候被創(chuàng)建,并不是第一次調(diào)用getInstance()方法的時(shí)候被創(chuàng)建的
延伸一點(diǎn):static修飾的成員變量所屬類被加載的時(shí)候,變量間會(huì)被分配空間,及就會(huì)被創(chuàng)建
懶漢式單例模式:
public class LazySingleton {private LazySingleton() {System.out.println("LazySingleton is create");}private static LazySingleton instance = null;private static synchronized LazySingleton getInstance() {if (instance == null)instance = new LazySingleton();return instance;} }私有化構(gòu)造方法的作用:不能new這個(gè)類的實(shí)例,從而避免該類被錯(cuò)誤的創(chuàng)建
只有當(dāng)調(diào)用getInstance()方法時(shí)才會(huì)創(chuàng)建單例對(duì)象,為了防止對(duì)象被多次創(chuàng)建,還須要使用synchronized進(jìn)行方法同步
好處:充分利用了延遲加載,只有在真正需要時(shí)才會(huì)創(chuàng)建對(duì)象
壞處:并發(fā)環(huán)境下加鎖,競(jìng)爭(zhēng)激烈的場(chǎng)合對(duì)性能會(huì)產(chǎn)生一定影響
另外還有一種,雙重判斷加雙同步(安全又高效):
public class SingleTon {private static volatile SingleTon singleTon = null;private SingleTon() {}public static SingleTon getInstance() {if (singleTon == null) {synchronized (SingleTon.class) {if (singleTon == null) {singleTon = new SingleTon();}}}return singleTon;} } 為什么雙重判斷: 如果單層if判斷,在服務(wù)器允許的情況下,假設(shè)有一百個(gè)線程,耗費(fèi)的時(shí)間為100*(同步判斷時(shí)間+if判斷時(shí)間),而如果雙重if判斷,100的線程可以同時(shí)if判斷,理論消耗的時(shí)間只有一個(gè)if判斷的時(shí)間。 所以如果面對(duì)高并發(fā)的情況,而且采用的是懶漢模式,最好的選擇就是雙重判斷加同步的方式。轉(zhuǎn)載于:https://www.cnblogs.com/java-spring/p/9075670.html
總結(jié)
以上是生活随笔為你收集整理的单例模式之懒汉式/饿汉式/结合二者之优的模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows版本jenkins部署dj
- 下一篇: 217. Contains Duplic