保證乙個類只有乙個例項,並且提供乙個訪問該例項的全域性訪問點。
– 主要:
• 餓漢式(執行緒安全,呼叫效率高。 但是,不能延時載入。)
• 懶漢式(執行緒安全,呼叫效率不高。 但是,可以延時載入。)
– 其他:
• 雙重檢測鎖式(由於jvm底層內部模型原因,偶爾會出問題。不建議使用)
• 靜態內部類式(執行緒安全,呼叫效率高。 但是,可以延時載入)
• 列舉單例(執行緒安全,呼叫效率高,不能延時載入)
/**
* 餓漢式實現(單例物件立即載入)
* @author fts
* */
public class singletondemo02 //私有化構造器
//不需要使用synchronized進行同步,
//使用private static /*final*/ singletondemo02 single = new singletondemo02();
//這種形式在類載入的時候就載入了,是一種天然的執行緒安全模式
//方法沒有同步,呼叫效率高
private static singletondemo02 getinstance()
/** 測試
*/public static void main(string args)
}
• 餓漢式單例模式**中,static變數會在類裝載時初始化,此時也不會涉及多個執行緒物件訪問該物件的問題。虛擬機器保證只會裝載一次該類,肯定不會發生併發訪問的問題。因此,可以省略synchronized關鍵字。
• 問題:如果只是載入本類,而不是要呼叫getinstance(),甚至永遠沒有呼叫,則會造成資源浪費!
/**
* 懶漢式實現(單例物件延時載入)
* @author fts
* */
public class singletondemo01 ;//私有化構造器
//方法同步,呼叫效率低
public static synchronized singletondemo01 getinstance()
return single01;
}}
• 要點:
– lazy load! 延遲載入, 懶載入! 真正用的時候才載入!
• 問題:
– 資源利用率高了。但是,每次呼叫getinstance()方法都要同步,併發效率較低。
/**
* 雙重檢測鎖實現
* @author fts
* */
public class singletondemo03
} instance = sc;
} }} return instance;
} private singletondemo03()
}
• 這個模式將同步內容下方到if內部,提高了執行的效率不必每次獲取物件時行同步,只有第一次才同步建立了以後就沒必要了。
• 問題:
• 由於編譯器優化原因和jvm底層內部模型原因,偶爾會出問題。不建議用。
/**
* 靜態內部類實現方式(也是一種懶載入方式)
* @author fts
* */
public class singletondemo04
public static singletondemo04 getinstance()
private singletondemo04()
}
• 要點:
– 外部類沒有static屬性,則不會像餓漢式那樣立即載入物件。
– 只有真正呼叫getinstance(),才會載入靜態內部類。載入類時是執行緒 安全的。 instance是static final
型別,保證了記憶體中只有這樣乙個例項存在,而且只能被賦值一次,從而保證了執行緒安全性.
– 兼備了併發高效呼叫和延遲載入的優勢!
/**
* 使用枚實現單例模式
* @author fts
* */
public enum singletondemo05
/*** 測試
* @param args
*/public static void main(string args)
}
• 優點:
– 實現簡單
– 列舉本身就是單例模式。由jvm從根本上提供保障!避免通過反射和反序列化的漏洞!
• 缺點:
– 無延遲載入
– 主要:
• 餓漢式(執行緒安全,呼叫效率高。 但是,不能延時載入。)
• 懶漢式(執行緒安全,呼叫效率不高。 但是,可以延時載入。)
– 其他:
• 雙重檢測鎖式(由於jvm底層內部模型原因,偶爾會出問題。不建議使用)
• 靜態內部類式(執行緒安全,呼叫效率高。 但是,可以延時載入)
• 列舉式(執行緒安全,呼叫效率高,不能延時載入。並且可以天然的防止反射和反序列
化漏洞!)
– 單例物件 占用 資源 少,不需要 延時載入:
• 列舉式 好於 餓漢式
– 單例物件 占用 資源 大,需要 延時載入:
• 靜態內部類式 好於 懶漢式
設計模式 單例模式
單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...
設計模式 單例模式
class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...
設計模式 單例模式
單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...