Java 設計模式之單例模式

2021-07-25 15:36:02 字數 1647 閱讀 4065

單例類只能有乙個例項;

單例類必須自己建立自己的唯一例項;

單例類必須給所有其他物件提供這一例項。

懶漢式:

public class singleton

public static singleton getinstance()

}

餓漢式:

public class singleton

private static singleton getinstance()

}

懶漢式顧名思義,在類載入的時候,並不對例項進行初始化,只有在用到物件的時候才初始化乙個例項,這也叫做延遲載入(lazy loading)。餓漢式是在類載入的時候,就例項化,沒有提供延遲載入的功能。懶漢式的延遲載入有利於節省記憶體,但多執行緒不安全;餓漢式避免了多執行緒的同步問題。下面看常用的三種執行緒安全的懶漢式單例模式

鎖方法

public class singleton

public static synchronized singleton getinstance()

}

雙重鎖

public class singleton

public static singleton getinstance()

}return instance;

}}

靜態內部類

public class singleton

private singleton(){}

public static final singleton getinstance()

}

第一種鎖方法的實現執行緒安全的方式,直接將同步關鍵字加在方法上,這樣每次呼叫改方法的時候都需要進行加鎖,而不管有沒有例項化,而加鎖的很耗時,這樣效率很低。ps:99%的情況下不需要同步。

第二種雙重鎖的方式,只有第一次進入的方法在建立例項的時候需要加鎖,以後再呼叫該方法都不需要加鎖,提高了效率。

第三種方式同樣利用了classloder的機制來保證初始化instance時只有乙個執行緒,它更像是一種提供了延遲載入的餓漢式方法。這種方式中singleton類被裝載,而instance不一定被初始化。因為singletonholder類沒有被主動使用,只有顯示通過呼叫getinstance方法時,才會顯示裝載singletonholder類,從而例項化instance。想象一下,如果例項化instance很消耗資源,我想讓他延遲載入,另外一方面,我不希望在singleton類載入時就例項化,因為我不能確保singleton類還可能在其他的地方被主動使用從而被載入,那麼這個時候例項化instance顯然是不合適的。

管理器相關的類,這種情況下管理器不能出現多個

封裝配置檔案的類,寫成單例避免衝突

資源相關的類,如訪問資料庫的資源建立需要消耗較多資源

要求生成唯一序列號

需要乙個共享訪問點或者共享資料,比如乙個計數器,可以把數值存在單例類中,而不是資料庫

在spring中,每個bean預設是單例的,這樣spring容器可以管理這些bean的生命週期。如果採用非單例模式(prototype型別),bean初始化後的管理交給j2ee容器,spring容器不再跟蹤管理bean的生命週期。

java設計模式之單例模式

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

java設計模式 之 單例模式

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

Java設計模式之單例模式

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