Java單例模式

2021-08-27 19:23:51 字數 1681 閱讀 3903

單例模式是開發中屬於經常用到的模式之一也是相對比較簡單的,單例顧名思義即在應用中始終存在乙個例項這也對應了其特點:

單例模式主要分為以下幾種寫法,不同的寫法有著不同的說法,下面我們一起來看下

首先是簡單單例寫法,即在初始化類的時候建立了例項。

/**

* * @author col.man

* 簡單單例模式

*/public class singleton

private singleton()

}

當類被載入上靜態變數instance將被初始化,此時的私有建構函式被呼叫,建立singleton的唯一例項。

private static singleton instance = new singleton();
此種寫法是典型的拿空間換時間,在類載入時即建立,不管你用不用,每次使用時不用做判斷節省了執行時間,假如建立這個物件需要耗費大量的空間且建立後不予是使用,那豈不是浪費,況且在單例模式中一般都是通過getinstance()來觸發類載入,顯然這種不是很理想,也沒達到懶載入的效果。

那麼就引出來簡單單例模式的進化版lazy loaded

public class singleton 

public static singleton getinstance()

return instance;

}}

這種寫法lazy loading很明顯,但是致命的是在多執行緒不能正常工作,那麼我們來進一步優化

public class singleton 

public static synchronized singleton getinstance()

return instance;

}}

這種寫法能夠在多執行緒中很好的工作,而且看起來它也具備很好的lazy loading,但是效率很低,大多數情況下不需要同步,那麼這種寫法還需要進一步優化;

我們來分析下加鎖的範圍,是需要整個方法都要加鎖還是某乙個語句加鎖就可以了,檢測null和建立物件的分離的,如果兩個操作能原子的操作那麼就達到單例的效果,於是修改**

public class singleton 

public static singleton getinstance()

} return instance;

}}

從**上看之前是方法體同步,現在是方法內同步,但還是在呼叫getinstance()的時候立即同步,效能上沒達到什麼改進,那麼如何進一步優化呢?我們可以想象如果instance==null 時我們在去同步會不好好一些呢,答案是肯定的,當例項生成後instance 就不空,此時判定instance == null 為false就不會進入同步。**如下

public class singleton 

public static singleton getinstance()

}} return instance;

}}

這就是double-checked locking設計實現單例模式。其實單例還有很多種寫法,比如列舉、靜態內部類等,在這裡就不一一講解,文筆不好勿噴...

java單例模式

第一種方法 public class singleton private static singleton singleton new singleton public static singleton getinstance 第二種方法 public class singleton private...

Java 單例模式

單例模式特點 1 單例類只能有乙個例項。2 單例類必須自己自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。一 餓漢式單例 基於classloder機制避免了多執行緒的同步問題,使用較多 public class singleton 這裡提供了乙個供外部訪問本class的靜態方法,可...

Java單例模式

單例模式的意圖是為了確保乙個類有且僅有乙個例項,並為它提供乙個全域性訪問點。單例模式通過隱藏建構函式,提供物件建立的唯一入口點,從而將類的職責集中在類的單個例項中。design patterns一書中把單例模式歸類為 建立型 模式,意圖是在表明單例物件承擔了其他物件所要依賴的職責。單例模式的優點 在...