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