單例模式的幾種實現方式

2022-08-23 06:39:08 字數 1223 閱讀 6133

單例模式的實現有多種方式,如下所示:

1、懶漢式,執行緒不安全

是否 lazy 初始化:是

是否多執行緒安全:否

實現難度:易

描述:這種方式是最基本的實現方式,這種實現最大的問題就是不支援多執行緒。因為沒有加鎖 synchronized,所以嚴格意義上它並不算單例模式。

這種方式 lazy loading 很明顯,不要求執行緒安全,在多執行緒不能正常工作。

**例項:

public class singleton   

public static singleton getinstance()   

return instance;  

}  }  

接下來介紹的幾種實現方式都支援多執行緒,但是在效能上有所差異。

2、懶漢式,執行緒安全

是否 lazy 初始化:是

是否多執行緒安全:是

實現難度:易

描述:這種方式具備很好的 lazy loading,能夠在多執行緒中很好的工作,但是,效率很低,99% 情況下不需要同步。

優點:第一次呼叫才初始化,避免記憶體浪費。

缺點:必須加鎖 synchronized 才能保證單例,但加鎖會影響效率。

getinstance() 的效能對應用程式不是很關鍵(該方法使用不太頻繁)。

**例項:

public class singleton   

public static synchronized singleton getinstance()   

return instance;  

}  } 

3、餓漢式

是否 lazy 初始化:否

是否多執行緒安全:是

實現難度:易

描述:這種方式比較常用,但容易產生垃圾物件。

優點:沒有加鎖,執行效率會提高。

缺點:類載入時就初始化,浪費記憶體。

它基於 classloder 機制避免了多執行緒的同步問題,不過,instance 在類裝載時就例項化,雖然導致類裝載的原因有很多種,在單例模式中大多數都是呼叫 getinstance 方法, 但是也不能確定有其他的方式(或者其他的靜態方法)導致類裝載,這時候初始化 instance 顯然沒有達到 lazy loading 的效果。

**例項:

public class singleton   

public static singleton getinstance()   

}  

單例模式實現的幾種方式

單例模式三個主要特點 1 構造方法私有化 2 例項化的變數引用私有化 3 獲取例項的方法共有。package com.ctl.singleton 懶漢式單例 該模式的特點是類載入時沒有生成單例,只有當第一次呼叫 getlnstance 方法時才去建立這個單例 注意 如果編寫的是多執行緒程式,則不要刪...

單例模式的幾種實現方式

單例模式莫過於是我們最常用的設計模式之一了,它的優缺點就是 優也單例,缺也單例 當然應用它方面優點還是較多些的,所以下面我們看看,常用的幾種實現方式有哪些吧。這種是最基本的實現方式,最大的問題就是不支援多執行緒,由於沒有加鎖,嚴格上並不算單例模式。public class singleton pub...

單例模式的幾種實現方式

public class person private person person new person 出現stackoverflowerror錯誤 因為建立物件需要呼叫構造方法執行 構造方法執行在棧記憶體中 每次建立物件需要載入屬性 該屬性又是當前類物件 造成無限迴圈建立物件 最終棧記憶體壓滿 ...