Java實現設計模式之單例模式

2021-08-01 21:37:41 字數 1851 閱讀 7086

1.       單例模式(singleton)保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

2.       通常,我們可以讓乙個全域性變數使得乙個物件被訪問,但它不能防止你例項化多個物件,乙個最好的辦法就是,讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項可以被建立,而且它可以提供乙個訪問該例項的方法。

3.       singleton類,定義乙個getinstance操作,允許客戶訪問它的唯一例項。getinstance是乙個靜態方法,主要負責建立自己的唯一例項。

4.       單例模式是對唯一例項的受控訪問。

5.       單例類和實用類(math類)的區別:

6.       為了保證多執行緒的時候也不建立多個例項,可以先使用lock來鎖住getinstace方法。

7.       雙重鎖定(double-check-locking):不讓執行緒每次都加鎖,而是用if判斷,在例項未被建立的時候再加鎖處理,同時也能保證多執行緒的安全。

8.       餓漢式單例模式:靜態初始化的方式是在自己被載入的時候就將自己例項化了。

9.       懶漢式單例模式:在第一次被引用時才將自己例項化。

10.    餓漢式:類一載入就例項化的物件,所以要提前占用系統資源。

11.     懶漢式:面臨多執行緒訪問的安全問題,需要雙重鎖定處理

1、懶漢式經典寫法:

public class singleton 

public static singleton getinstance()

return instance;}}

2、懶漢式執行緒,執行緒安全寫法,利用sychronized關鍵字:

public static synchronized singleton getinstance() 

return instance;

}

3、懶漢式,執行緒安全寫法,雙重檢驗鎖模式(double checked locking pattern)

雙重檢驗鎖使用原因:對於instance存在的情況,直接返回沒有問題。但是當instance為null,並且同時有兩個執行緒呼叫getinstance()方法時,它們都可以通過第一重instance=null的判斷,然後由於lock機制,只有乙個能夠進入,另乙個在外面排隊,此時如果沒有第二個instance=null的判斷,後乙個進入的執行緒還是可以繼續建立例項。

public static singleton getsingleton() }}

return instance ;

}

5、懶漢式,靜態內部類寫法。

使用jvm機制保證執行緒安全,因為singletoholder是私有的,除了get方法不能訪問。

public class singleton   

private singleton (){}

public static final singleton getinstance()

}

4、餓漢式,經典寫法(static final)

在第一次載入類到記憶體中就會初始化,建立例項本身就是安全的。

public class singleton

public static singleton getinstance()

}

但是餓漢式並不是完美的,如果singleton例項是依賴引數或者是配置檔案的,不能在載入時就初始化,這樣的場景是不能使用的。

參考:【

java設計模式之單例模式

單位面試題目中有一道關於單例模式的題目.大多數參加筆試的同事都會寫出getinstance這個函式,但是當我問起什麼情況下需要使用單例 單例具體有什麼好處的時候 static函式也可以構建唯一例項,為什麼還需要單例.從使用單例的經驗來看,如下場景下,個人感覺應該使用單例 1.如果需要構建乙個工具類,...

java設計模式 之 單例模式

單例模式 有些類在程式執行過程中只需要儲存乙個例項,比如檔案管理類,音訊管理類,那麼我們如何實現乙個單例類呢?有以下幾點 1 定義乙個靜態變數 2 建構函式私有化 3 提供乙個public 靜態方法,獲取這個例項 4 一定要做執行緒同步 public static class singleton p...

Java設計模式之單例模式

說到單例模式 大家一定非常熟悉 這是最常見也是設計模式中相對簡單 好理解的設計模式 今天就跟大家掰一掰單例模式 單例模式確保某個類只有乙個例項 應用場景 執行緒池 快取 等物件常常被設計成單例 然而單例分兩種 1 惡漢式 2 懶漢式 我們先來看下 惡漢式 public class singleton...