設計模式之單例模式

2021-08-21 06:46:08 字數 1224 閱讀 2478

單例模式:

用來建立第一無二的,只能有乙個例項的物件的入場卷。

為什麼需要獨一無二的物件?

有些物件只需要乙個,如執行緒池、快取等。如果建立多個例項或許會出現很多問題。

或許可以使用全域性靜態變數就可以只生成乙個物件,但是用前局標量可能回一開始就會建立好物件,如果這個物件非常耗資源,如果沒用到就會很非資源。

單例設計模式詳情:

詳細分為兩種:

餓漢式:

package eagerly;

public class eagerly

}class eagerlyinstance

}

設計乙個類,在被載入時直接建立好物件,當要有新的物件要求載入時,返回這個物件的引用。

優點:不會出現同步問題。

缺點:在類載入時就例項化物件,可能造成資源浪費

懶漢式(飽漢式)

(1).最經典的懶漢式

class singletonelse 

}

這種模式單例會出現執行緒安全問題。

(2).同步方法的懶漢式

class singletonsafeandslowelse 

}public static void print()

}

通過給方法加了同步關鍵字,那麼解決了執行緒安全問題,但是會很耗費時間

(3).雙重檢查鎖

class singletonsafeandfast

}else

通過加了兩個if語句和乙個同步**塊組合使用。通過雙重if語句實現了同步**塊,解決了同步方法的開銷大問題。

但是這個方法有乙個要注意的點就是我們定義的物件引用是加了volatile關鍵字。這個關鍵字的功能是:

並不是乙個原子操作,會被編譯成三條指令,如下所示。 

1.給類的例項分配記憶體 2.初始化類的構造器 3.將instance物件指向分配的記憶體空間(注意 此時instance就不為空) 

jvm執行上面三條指令的時候,不一定是1-2-3這樣執行,有可能是1-3-2這樣執行。如果jvm是按照1-3-2來執行的話,當1-3執行完2還沒執行的時候,如果另外乙個執行緒呼叫getinstance(),因為3執行了此時instance不為空,直接返回instance。問題是2還沒執行,此時instance相當於什麼都沒有,肯定是有問題的。然後咧,voliate有乙個特性就是禁止指令重排序

設計模式之單例模式

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