目前缺枚舉類實作:
package pattern;
public class SingleInstance{
private static SingleInstance sInstance = new SingleInstance();
private SingleInstance(){}
public static SingleInstance getInstance(){
return sInstance;
}
public static void main(String[] arg) {
System.out.println(SingleInstance.getInstance());
System.out.println(SingleInstance.getInstance());
System.out.println(SingleInstance2.getInstance());
System.out.println(SingleInstance2.getInstance());
System.out.println(SingleInstance3.getInstance());
System.out.println(SingleInstance3.getInstance());
System.out.println(SingleInstance4.getInstance());
System.out.println(SingleInstance4.getInstance());
System.out.println(SingleInstance5.getInstance());
System.out.println(SingleInstance5.getInstance());
}
}
class SingleInstance2 {
private static SingleInstance2 sInstance;
private SingleInstance2(){}
public static SingleInstance2 getInstance(){
if( null == sInstance){
sInstance = new SingleInstance2();
}
return sInstance;
}
/* 上述的代碼在多個線程密集調用getInstance時,存在建立多個執行個體的可能。
* 比如線程A進入null == sInstance這段代碼塊,而在A線程未建立完成執行個體時,
* 如果線程B也進入了該代碼塊,必然會造成兩個執行個體的産生。
*
*/
}
class SingleInstance3 {
private static SingleInstance3 sInstance;
private SingleInstance3() {}
public static synchronized SingleInstance3 getInstance(){
if (null == sInstance){
sInstance = new SingleInstance3();
}
return sInstance;
}
}
/* Volatile是輕量級的synchronized,它在多處理器開發中保證了共享變量的“可見性”。
* 可見性的意思是當一個線程修改一個共享變量時,另外一個線程能讀到這個修改的值。
* 使用volatile修飾sInstance變量之後,可以確定多個線程之間正确處理sInstance變量。
*
*/
class SingleInstance4 {
private static volatile SingleInstance4 sInstance;
private SingleInstance4(){}
public static SingleInstance4 getInstance(){
if(null==sInstance){
synchronized(SingleInstance4.class){
if(null == sInstance){
sInstance = new SingleInstance4();
}
}
}
return sInstance;
}
}
/* 在Java中,類的靜态初始化會在類被加載時觸發,我們利用這個原理,可以實作利用這一特性,
* 結合内部類,可以實作如下的代碼,進行懶漢式建立執行個體。
*
*/
class SingleInstance5 {
private SingleInstance5(){}
public static SingleInstance5 getInstance() {
return SingleInstanceHolder.sInstance;
}
private static class SingleInstanceHolder {
private static SingleInstance5 sInstance = new SingleInstance5();
}
}