概念:
優點:缺點:
實現單例模式最關鍵的步驟就是構造器私有
/**
* 單例模式是最常見的一種設計模式
* 它有以下特點
* 1、單例類只能有乙個例項
* 2、單例類必須自己建立自己的唯一例項
* 3、單例類必須給所有其他對線提供這一例項
* * 餓漢式單例模式
* 餓漢式的特點就在於
* 在類建立的同時就建立好了乙個靜態的物件供系統使用
* 以後不會再改變,所以天生就是執行緒安全的
* 但是這會造成記憶體的浪費
* @author kimariyb
*/public class hungryman
public static hungryman getinstance()
}
餓漢式單例無疑是最簡單的,最容易實現的一種模式了1.2.1 執行緒不安全的
執行緒不安全的懶漢式是最基本的實現方式,它最大的問題就在於不支援多執行緒安全。它在多執行緒下是不能工作的。
/**
* 懶漢式單例
* 懶漢式的特點就在於
* 它不會造成記憶體的浪費
* 但是它會帶來多執行緒安全的問題
* @author kimariyb
*/public class lazymanunsafe
public static lazymanunsafe getinstance()
return lazymanunsafe;}}
1.2.2 執行緒安全的
在原來的**基礎上加上關鍵字synchronized
才能保證單例,這使得多執行緒安全得到保障。但是會影響效率。
/**
* 這是一種執行緒安全的懶漢式
* 它主要的原理就在於
* 加上了鎖 synchronized
* 能在多執行緒中工作,但是這降低了效率
* @author kimariyb
*/public class lazymansafe
public static synchronized lazymansafe getinstance()
return lazymansafe;}}
這是一種能在多執行緒下執行並且高效能的單例模式
/**
* 雙重檢測(dcl)
* dcl 模式下最重要的莫過於 volatile 關鍵字
* 它會解決指令重排的問題
* @author kimariyb
*/public class doublecheck
public static doublecheck getinstance() }}
return doublecheck;}}
所謂的原子性操作指的是所處的層(layer)的更高層不能發現其內部實現與結構。原子操作可以是乙個步驟,也可以是多個操作步驟,但是其順序不可以被打亂,也不可以被切割而只執行其中的一部分。 這種方式能達到雙檢鎖方式一樣的功效,但實現更簡單。對靜態域使用延遲初始化,應使用這種方式而不是雙檢鎖方式。這種方式只適用於靜態域的情況,雙檢鎖方式可在例項域需要延遲初始化時使用。
/**
* 靜態內部類
* 在內部類中宣告物件
* @author kimariyb
*/public class staticholder
private static class holderclass
public static staticholder getinstance()
}
在說明列舉如何實現之前,我們應該思考,為什麼列舉能夠實現單例模式,這樣做的優點在**。
1.5.1 使用反射破壞單例
在 j**a 中反射是乙個很強大的功能,毫不誇張的講,反射是萬能的。
public static void main(string args) throws exception
輸出結果如下:
根據雜湊值,我們很清楚的看見單例模式被破壞了!1.5.2 使用列舉避免被反射破壞
使用列舉來避免反射被破壞的原理,我們可以在 j**a 原始碼中窺見一二。我們找到newinstance()
方法的原始碼,可以看見一行 "cannot reflectively create enum objects"。
* 列舉類
* 列舉本身也是乙個 class
* * @author kimariyb
*/public enum enumsingle
}
23種設計模式 單例模式
某些情況,如 執行緒池,乙個專案中匯流排程數量以及生命週期,可能需要統一控制 如果執行緒池自身可建立多個例項,那麼就無法統一控制,此時,只要能控制線程池物件的數量為乙個,那麼就可以實現統一控制的目標 注意 現實中真正使用純的單例模式並不多 如 spring bean 通過配置來決定是否使用單例 執行...
單例模式(23種設計模式)
單例模式 餓漢模式 class singletondemo public static singletondemo gets 懶漢模式 class singletondemo1 public static singletondemo1 gets return instance 單例模式,懶漢式,執行...
23種設計模式 單例模式
單例模式需要保證,構造方法一定是私有化的,並且類的全域性變數必須是靜態的,私有的 這樣才能有唯一的例項化途徑 錯誤 一 public class singleton public static singleton getinstance 上述方法,並沒有把類變數singleton設定為靜態的,這樣,...