/**
* 餓漢單例
* 優點:簡單、執行緒安全
* 缺點:浪費記憶體(我們的單例物件數量不可控的時候,可能會造成記憶體浪費)
*/public class hungraysingleton
//提供全域性訪問點
public final static hungraysingleton getinstance()
}
/**
* 餓漢靜態**塊
*/public class hungraystaticsingleton
public hungraystaticsingleton()
public static hungraystaticsingleton getinstance()
}
/**
* 懶漢式
* 優點:節省資源,效能更高
* 缺點:執行緒不安全
*/public class lazysingleton
/*** 新增synchronized是可以保障線程安全,但是效能會下降
*/public synchronized static final lazysingleton getinstance()
return instance;
}}
/**
* 懶漢雙重檢查鎖
* 優點:效能高,執行緒安全,避免記憶體浪費
* 缺點:不優雅
* */
public class lazydoublechecksingleton
public static final lazydoublechecksingleton getinstance() }}
return instance;
}}
**
* 懶漢,靜態內部類
* 優點:效能高,執行緒安全,避免記憶體浪費
* 缺點:不優雅了
*/public class lazystaticinnerclasssingleton
}public static final lazystaticinnerclasssingleton getinstance()
private final static class lazyholdler
}
/**
* 列舉可以歸到餓漢單例中
* **************************推薦用列舉實現單例******************************
* 最優雅的單例實現模式就是列舉模式。利用列舉的特性,讓jvm來幫我們保證執行緒安全和單一例項的問題。
*/public enum enumsingleton
public string getinstance()
}
/**
* 容器式單例,是列舉式單例的公升級
* spring中的做法,就是這種註冊式單例
*/public class containersingleton
private static mapioc = new concurrenthashmap();
public static object getinstance(string classname) catch (exception e)
return obj;
} else }}
return ioc.get(classname);
}}
/*** threadlocal 實現單例模式
* 不能保證整個程式唯一;
* 可以保證執行緒唯一;
* 每個執行緒中拿到的例項都是乙個;
* 不同的執行緒拿到的例項不是乙個;
*/public class threadlocalsingleton
};private threadlocalsingleton()
public static threadlocalsingleton getinstance()
}
public class threadlocalrunnable implements runnable}
threadlocalsingleton instance = threadlocalsingleton.getinstance();執行結果system.out.println(thread.currentthread().getname() + " : " + instance);
instance = threadlocalsingleton.getinstance();
system.out.println(thread.currentthread().getname() + " : " + instance);
instance = threadlocalsingleton.getinstance();
system.out.println(thread.currentthread().getname() + " : " + instance);
instance = threadlocalsingleton.getinstance();
system.out.println(thread.currentthread().getname() + " : " + instance);
instance = threadlocalsingleton.getinstance();
system.out.println(thread.currentthread().getname() + " : " + instance);
thread t1 = new thread(new threadlocalrunnable());
thread t2 = new thread(new threadlocalrunnable());
t1.start();
t2.start();
system.out.println("program end");
main : com.pa.designmode.singleton.threadlocalsingleton@65ab7765
main : com.pa.designmode.singleton.threadlocalsingleton@65ab7765
main : com.pa.designmode.singleton.threadlocalsingleton@65ab7765
main : com.pa.designmode.singleton.threadlocalsingleton@65ab7765
main : com.pa.designmode.singleton.threadlocalsingleton@65ab7765
program end
thread-0 : com.pa.designmode.singleton.threadlocalsingleton@2770f418
thread-1 : com.pa.designmode.singleton.threadlocalsingleton@dc7a4fc
單例設計模式的八種方式
餓漢式 靜態常量 class singleton private final static singleton instance newsingleton public static singleton getinstance 優點 類載入的時候就完成例項化,避免了執行緒同步的問題 不足 沒有懶載入...
7種方式實現單例模式
單例模式,即是整個類有且只有乙個類例項,通過這個唯一的例項為全域性提供服務。單例類的構造方法為私有的,通過乙個暴露給外界的獲取例項方法來呼叫私有構造方法,保證例項的唯一性。因為餓漢式單例在類載入時就初始化了唯一的例項 且只會初始化一次,所以,該例項是唯一的,即 執行緒安全的 因此,如果我們想要為例項...
單例模式(5種實現方式)
1.餓漢式 不支援併發 此模式只能執行在單執行緒下,且類在載入時就已經建立好了例項,不管需不需要用。package com.lys 餓漢式 public class singleton1 private static singleton1 instance new singleton1 public...