在23種設計模式中,單例是最簡單的設計模式,但是也是很常用的設計模式。從單例的五種實現方式中我們可以看到程式設計師對效能的不懈追求。下面我將分析單例的五種實現方式的優缺點,並對其在多執行緒環境下的效能進行測試。
單例模式適用於資源占用較多的類,保證乙個類只有乙個例項即單例。通用的做法就是構造器私有化,提供乙個全域性的訪問點,返回類的例項。
uml圖:
**實現:
package com.zgh.gof23.singleton;
/** * 餓漢式
*@author yuelin
* */
public
class
singledemo
}//對外提供統一的訪問點
public
static singledemo getinstance()
}
1.例項的初始化由jvm裝載類的時候進行,保證了執行緒的安全性
2.實現簡單方便
3.例項的訪問效率高
1.不能實現懶載入,如果不呼叫getinstance(),那麼這個類就白白的佔據記憶體,資源的利用率不高
1.防止通過反射呼叫構造方法破解單例模式。
2.防止通過反序列產生新的物件。
**實現:
package com.zgh.gof23.singleton;
/** * 懶漢式實現單例
* *@author zhuguohui
* */
public
class
singledemo2
}/**
* 當呼叫此方法的時候才初始化例項, 為了實現執行緒安全,需要使用同步方法
* *@return
*/public
static
synchronized singledemo2 getinstance()
return instance;}}
1.只有使用這個類的時候才初始化例項,優化了資源利用率
1.為了實現執行緒安全,使用了同步方法獲取,增加了訪問的開銷
1.防止通過反射呼叫構造方法破解單例模式。
2.防止通過反序列產生新的物件。
**實現:
package com.zgh.gof23.singleton;
/** * 雙重檢查
* *@author zhuguohui
* */
public
class
singledemo3
}public
static singledemo3 getinstance() }}
return instance;}}
1.實現懶載入
2.通過縮小同步區域和第一次檢查提高訪問效率
1.為了實現執行緒安全,使用了同步方法獲取,增加了訪問的開銷
1.防止通過反射呼叫構造方法破解單例模式。
2.防止通過反序列產生新的物件。
**實現:
/**
* 靜態內部類實現單例
* *@author zhuguohui
* */
public
class
singledemo4
private
singledemo4()
}/**
* 呼叫這個方法的時候,jvm才載入靜態內部類,才初始化靜態內部類的類變數。由於由jvm初始化,保證了執行緒安全性,
* 同時又實現了懶載入
*@return
*/public
static singledemo4 getinstance()
}
1.即實現了執行緒安全,又實現了懶載入
2.實現稍顯複雜
**實現:
/**
* 列舉實現單例
* 列舉由jvm實現其的單例性
*@author zhuguohui
* */
public
enum singledemo5
lock.finish();
}}).start();
}//等待所有執行緒執行完
lock.waitforwrok();
long end = system.currenttimemillis();
system.out.println("總共耗時" + (end - start));}}
為了統計所以執行緒執行完需要的時間,我寫了乙個工具類
package com.zgh.gof23.singleton;
public
class
countlock
/*** 當乙個執行緒完成任務以後,呼叫一次這個方法
*/public
synchronized
void
finish()
}/**
* 需要等待其他執行緒執行完的執行緒,呼叫此方法。
*/public
synchronized
void
waitforwrok() catch (interruptedexception e) }}
}
五種單例實現方式,在100個執行緒下,每個執行緒訪問1千萬次例項的用時.tables
實現方式
用時(毫秒)
1餓漢式132
懶漢式10778
3雙重檢查154
靜態內部類145
列舉12
(*注意:由於不同電腦之間的效能差異,測試的結果可能不同)
如果需要懶載入就使用靜態內部類方式,如果不需要就使用列舉方式。
單例模式的五種實現方式
1.最容易想到的方式 public class singleton public static singleton getinstance public static void main string args 優點是 簡單 缺點是 無論用沒用到instsnce,都會進行初始化。2.延遲載入 laz...
單例模式的五種實現方式
單例模式 無論在什麼時候,該類只有乙個例項。實現單例模式的要點就是提供乙個私有的無參建構函式。一 餓漢單例模式public class singleobject public static singleobject getinstance 二 懶漢單例模式 懶漢的意思就是慢悠悠的,不著急,也就是在呼...
面試題 單例模式及其五種實現方式
只有乙個例項 自行例項化 必須建立自己的唯一例項 向整個系統提供這個例項 通俗一點的說就是,保證乙個類只有乙個例項,並且提供乙個訪問該例項的全域性訪問點。單例模式主要是通過以下思路實現 其中在提供私有的靜態屬性時就new例項,稱為餓漢式 餓了就吃 在提供的公共的靜態方法中new例項,成為懶漢式 餓了...