通過某個類創(chuàng)建對象時,在整個程序中,只能創(chuàng)建一個對象,這種類稱為單例類。
餓漢式(類一旦加載,單例就初始化完成,保證調(diào)用getInstance的時候,單例已經(jīng)存在)
單例類會一直占用資源
package com.javawu.singleton;
public class Singleton{
private static Singleton singleton= new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return singleton;
}
}
懶漢式(延遲加載,調(diào)用getInstance的時候才回去初始化這個單例)
package com.javawu.singleton;
public class Singleton{
#2.聲明類的靜態(tài)變量(靜態(tài)變量跟對象無關)
private static Singleton singleton = null;
#1.使用private修飾默認的構造方法(類外部不能使用new創(chuàng)建對象)
private Singleton () {
// TODO 自動生成的構造函數(shù)存根
}
#3.創(chuàng)建返回對象的方法
#4.判斷,對象存在不再創(chuàng)建
#5.(1)為了保證線程同步,改為同步方法(每次調(diào)用都會做線程同步)
public static synchronized Singleton getInstance() {
if(singleton == null) {
singleton = new Singleton ();
}
return singleton;
}
#5.(2)雙重檢查鎖定(和1相比只有第一次調(diào)用單例的時候才會做線程同步)
//使用雙重檢查鎖定,signleton需要用volatile修飾
//即 private volatile static Singleton sigleton = null;
//詳見:http://www.iteye.com/topic/652440
public static Singleton getInstance() {
if(singleton == null) {
synchronized(Singleton.class) {
if(singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
#5.(3)靜態(tài)內(nèi)部類(3種延遲加載方式中最優(yōu)的)
public static Singleton getInstance() {
private static class Holder {
private static final Singleton instance = new Singleton();
}
private Singleton() {
}
public static final Singleton getInstance() {
return Holder.instance;
}
}
}
據(jù)稱還有一個最佳的單例實現(xiàn)方法--單個成員的枚舉
package com.javawu.singleton;
public enum Singleton {
//定義一個枚舉元素
instacnce;
//這個單例類具有的方法
public void method() {
}
}