一直在用單例模式,但是也不清楚爲什麼用它,它能給系統帶來什麼樣的性能提升,當再次用到它的時候,決定要好好研究一下,也給自己留下點影響!
使用單例的目的是爲了避免不一致問題,防止狀態變化!簡單說來就是,防止我們頻繁初始化類的時候造成數據狀態不一致的問題,通過單例模式可以保證類的唯一性。
☆特性
1.單例類只能有一個實例;
2.單例類必須自己創建自己的唯一實例;
3.單例類給其他所有對象提供這一實例;
☆單例分類
·餓漢式
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//靜態工廠方法
public static Singleton1 getInstance() {
return single;
}
}
·懶漢式
public class Singleton {
private Singleton() {}
private static Singleton single=null;
//靜態工廠方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
☆餓漢式和懶漢式的比較
餓漢式,顧名思義就是“有則生產,生產則使用”;而懶漢式會根據內存中的情況來創建;
|
餓漢
|
懶漢 |
線程安全 |
餓漢式天生就是線程安全的,可以直接用於多線程而不會出現問題,
|
懶漢式本身是非線程安全的,爲了實現線程安全可以通過synchronized 關鍵字實現、雙重檢查鎖定、靜態內部類,這三種實現在資源加載和性能方面有些區別。 |
資源加載和性能 |
餓漢式在類創建的同時就實例化一個靜態對象出來,不管之後會不會使用這個單例,都會佔據一定的內存,但是相應的,在第一次調用時速度也會更快,因爲其資源已經初始化完成,
|
而懶漢式顧名思義,會延遲加載,在第一次使用該單例的時候纔會實例化對象出來,第一次調用時要做初始化,如果要做的工作比較多,性能上會有些延遲,之後就和餓漢式一樣了 |
由於懶漢式不能夠保證線程安全,所以可以通過以下方式來彌補其缺陷:
1.synchronized 關鍵字
public static synchronized Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
2.雙重檢查鎖定
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
3.靜態內部類
public class Singleton {
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
以上便是對GoF中的單例模式的一些解讀,甚是基礎,也是對之前學習的一個總結和鞏固!相比每次很菜的new class的時候,單例模式確實會提高一些系統的性能,儘管很渺小,但是這就是我們對完美的追求。
參考:http://blog.csdn.net/jason0539/article/details/23297037/