單例模式的實現有多種方式,如下所示:
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錯誤 因為建立物件需要呼叫構造方法執行 構造方法執行在棧記憶體中 每次建立物件需要載入屬性 該屬性又是當前類物件 造成無限迴圈建立物件 最終棧記憶體壓滿 ...