接下來就說下單例模式了,這個在實際應用還是比較常用的!
首先,單例分為懶漢式和餓漢式:
餓漢式:類加載的時候,建立對象。 是以類加載速度慢, 線程相對安全
懶漢式:類加載的時候,不會建立對象,調用時才會建立對象。是以類加載速度快,線程相對不安全,一般要配合synchronized使用。
廢話少說,下面是餓漢式:
支援延遲加載
public class Single {
//餓漢式:
private static Single single=new Single();
private Single() {
}
public static Single getSingle(){
return single;
}
}
單例模式思路:
- 私有屬性
- 私有構造方法
- 公開的getSingle方法
單例模式作用:
保證了對象的唯一性
- 适用場景:
1.需要生成唯一序列的環境
2.需要
頻繁執行個體化然後銷毀
的對象。
3.建立對象時
耗時過多或者耗資源過多
,但又經常用到的對象。
4.友善資源互相通信的環境
懶漢式如下:
不支援延遲加載。加了鎖導緻這個函數的并發度很低
public class Single2 {
//懶漢式:
private static Single2 single=null;
private Single2(){
}
/**
* 懶漢模式在使用時,容易引起不同步問題,是以應該建立同步"鎖"
* @return
*/
public static Single2 getSingle(){
synchronized (this){
if(single==null){
single=new Single2();
}
}
return single;
}
}
雙重檢測機制
既保證了線程安全,又能做到延遲加載。
解決了懶漢式并發度低的問題
public class Singleton5 {
private static Singleton5 singleton5 = null;
private Singleton5() {
}
public Singleton5 getSingleton5() {
if (singleton5 == null) {
synchronized (Singleton5.class) { //類級别鎖
if (singleton5 == null) {
singleton5 = new Singleton5();
}
}
}
return singleton5;
}
}
最後咱們來談下,單例模式的優缺點:
優點:
1.實作了對唯一執行個體通路的可控
2.對于一些需要
來說可以
頻繁建立和銷毀的對象
提高系統的性能。
缺點:
1.
不适用于變化頻繁的對象
2.濫用單例将帶來一些負面問題,如為了節省資源将資料庫連接配接池對象設計為的單例類,可能會導緻共享連接配接池對象的程式過多而出現連接配接池溢出。
3.如果執行個體化的對象長時間不被利用,系統會認為該對象是垃圾而被回收,這可能會導緻對象狀态的丢失。
以上有寫的不對的地方,請及時通知部落客,以做修改!!!!