單例模式的原理:保證一個(gè)類有一個(gè)實(shí)例,并且提供一個(gè)全局的訪問點(diǎn)(內(nèi)存地址唯一)
專業(yè)從事網(wǎng)站制作、網(wǎng)站建設(shè),高端網(wǎng)站制作設(shè)計(jì),微信平臺(tái)小程序開發(fā),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團(tuán)隊(duì)竭力真誠服務(wù),采用H5技術(shù)+CSS3前端渲染技術(shù),成都響應(yīng)式網(wǎng)站建設(shè),讓網(wǎng)站在手機(jī)、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項(xiàng)小組,與您實(shí)時(shí)在線互動(dòng),隨時(shí)提供解決方案,暢聊想法和感受。
實(shí)現(xiàn)方式:
1、飽漢模式:
1: publicclass Singleton{
2:
3: privatestatic Singleton s = null;
4:
5: private Singleton(){
6:
7: }
8:
9: publicstatic Singleton getInstance(){
10:
11: if(s ==null){
12: s = new Singleton();
13: }
14: return s;
15: }
16: }
2、餓漢模式
1: publicclass Singleton{
2: privatestatic Singleton s = new Singleton();
3: private Sinleton(){}
4: publicstatic Singleton getInstance(){
5: return s;
6: }
7: }
單例模式的線程安全問題:
1、通過synchronized關(guān)鍵字來實(shí)現(xiàn)
1: publicclass Single
2: {
3: privatestatic Single single ;
4: private Single(){
5: }
6: publicstaticsynchronized Single getInstance(){
7: if(single == null){
8: single = new Single();
9: }
10: return single;
11: }
12: }
這樣的話可以強(qiáng)制在程序運(yùn)行過程中只有一個(gè)線程調(diào)用該方法獲得該類的一個(gè)實(shí)例,但是缺點(diǎn)也是如此:只有在第一次使用該對象時(shí)需要同步,再次
獲取該對象時(shí)就不需要再同步了,這時(shí)候的同步就變的多余了。
2、其實(shí)餓漢模式就是改善多線程的一種有效手段,這樣JVM保證任何線程訪問單例對象時(shí),一定先創(chuàng)建該實(shí)例,代碼同上
3、另外一種改善多線程的方式
1: publicclass Singleton {
2:
3: privatevolatilestatic Singleton uniqueInstance;
4:
5: private Singleton() {}
6:
7: publicstatic Singleton getInstance() {
8: if(uniqueInstance == null) { //(1)
9: //只有第一次才徹底執(zhí)行這里的代碼
10: synchronized() {
11: //再檢查一次
12: if(uniqueInstance == null)
13: uniqueInstance = new Singleton();
14: }
15: }
16: return uniqueInstance;
17: }
18: }
在最開始如果有1、2、3個(gè)線程走到了(1)處,假設(shè)1進(jìn)入了同步塊,2、3等待。1實(shí)例化后,2進(jìn)入同步塊,發(fā)現(xiàn)uniqueInstance已經(jīng)不為空,跳出同步塊。接著3進(jìn)入,又跳出同步塊。
volatile關(guān)鍵字確保:當(dāng)uniqueInstance變量被初始化成Singleton實(shí)例時(shí),多個(gè)線程正確地uniqueInstance變量。如果性能是你關(guān)心的重點(diǎn),那么這個(gè)做法可以幫你大大地減少getInstance()的時(shí)間耗費(fèi)。