package com.bjsxt.cn.singleton;
/**
* 餓漢式建立單例模型
* 餓漢式單例模型的特點:
* 1, 私有的該類對象靜态屬性
* 2, 私有的構造器
* 3, 公共的靜态方法通路靜态屬性(是以需要時靜态的環境)
* @author wanna
*
*/
public class SingletonDemo1 {
//餓漢式,餓,非常餓,上來就吃了
//類初始化的時候,立即加載這個對象(沒有延時加載的能力)。如果加載該類非常複雜,而在之後卻又并沒有通路該對象,造成資源的狼糞
//由于加載類是天然線程安全的,是以餓漢式單例模式線程安全
private static SingletonDemo1 instance = new SingletonDemo1();
private SingletonDemo1() {
}
//該通路方法沒有同步synchronized,是以調用效率高
public static SingletonDemo1 getInstance() {
return instance;
}
}
package com.bjsxt.cn.singleton;
/**
* 2015年3月26日22:14:30
* 懶漢式單例模式
* 該懶漢式的特點是:
* 1, 構造器私有
* 2, 私有靜态屬性,類型為該類的對象,但是在聲明時并沒有初始化。因為Lazy load。因為懶惰
* 3, 靜态通路私有的那個靜态屬性的靜态方法。但是在該方法體中先要檢查該靜态屬性是否為空,為空則new,否則直接傳回
*
* @author wanna
*
*/
public class SingletonDemo2 {
private SingletonDemo2() {
}
private static SingletonDemo2 instance;
//因為該方法加了同步synchronized,效率低,但是具有延時加載的能力。提高了資源的使用率
public static synchronized SingletonDemo2 getInstance() {
if (instance == null) {
instance = new SingletonDemo2();
}
return instance;
}
}
package com.bjsxt.cn.singleton;
/**
* 2015年3月26日22:14:38
*
* 測試雙重檢測鎖式單例模式
* 雙重檢測鎖式單例模式的特點與懶漢式相似,但最重要的差別是在通路靜态屬性的執行個體時的過程
*
* 但是由于編譯器底層優化和JVM内部模型,偶爾會出問題,不建議使用
* @author wanna
*
*/
public class SingletonDemo3 {
private static SingletonDemo3 instance = null;
private SingletonDemo3() {
}
//該方法把懶漢式單例模式中的synchronized同步下移到if中,提高了執行效率,不用每次擷取對象時都需要進行同步。
//隻有第一次建立需要同步,之後就不需要了。
public static SingletonDemo3 getInstance() {
if (instance == null) {
SingletonDemo3 sc;
synchronized(SingletonDemo3.class) {
sc = instance;
if (sc == null) {
synchronized(SingletonDemo3.class) {
if (sc == null) {
sc = new SingletonDemo3();
}
}
instance = sc;
}
}
}
return instance;
}
}
package com.bjsxt.cn.singleton;
/**
* 2015年3月26日22:14:45
* 靜态内部類實作單例模式
* 這種方式線程安全,執行效率高,并且可以延時加載
* 特點:
* 1, 構造器私有
* 2, 靜态屬性修改為靜态内部類,在内部類中定義了外部類的靜态final屬性(好像删去final也不影響)
* 3, 靜态通路靜态屬性的方法,在方法體重傳回在内部類new出來的外部封裝類對象。也就實作了延時加載
* @author wanna
*
*/
public class SingletonDemo4 {
private static class SingltonClassInstance {
private static SingletonDemo4 instance = new SingletonDemo4();
}
public static SingletonDemo4 getInstance() {
return SingltonClassInstance.instance;
}
private SingletonDemo4() {
}
}
package com.bjsxt.cn.singleton;
/**
* 測試枚舉實作單例模式(沒有延時加載)
* @author wanna
*
*/
public enum SingletonDemo5 {
Instance;//該枚舉元素本身就是單例對象
//添加自己需要的操作
public void operation() {
}
}