先不論單例模式的寫(xiě)法,有些方面是相同的,比如都需要將唯一的對(duì)象設(shè)置為static的,都需要將構(gòu)造方法private化,代碼如下:

在象州等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需設(shè)計(jì)網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站建設(shè),外貿(mào)網(wǎng)站建設(shè),象州網(wǎng)站建設(shè)費(fèi)用合理。
public class MyInstance { private static MyInstance instance; private MyInstance(){}
}
第一種:最原始的單例模式,代碼如下:
public static MyInstance getInstance(){ if(instance==null){ instance=new MyInstance();
} return instance;
}
多線程并發(fā)時(shí),可能會(huì)出現(xiàn)重復(fù)new對(duì)象的情況,因此不提倡使用。
第二種:將整個(gè)方法塊進(jìn)行加鎖,保證線程安全。
public static synchronized MyInstance getInstance(){ if(instance==null){ instance=new MyInstance();
} return instance;
}
這種代碼下,每條線程都會(huì)依次進(jìn)入方法塊內(nèi)部,雖然實(shí)現(xiàn)了單例,但是影響了運(yùn)行效率,可以使用但是也不怎么提倡。
第三種:進(jìn)一步優(yōu)化的方法。
public static MyInstance getsInstance(){ synchronized (MyInstance.class){ if(instance==null){ instance=new MyInstance(); return instance;
}else{ return instance;
}
}
}
這種方式只是第二種方法的一種優(yōu)化,但是優(yōu)化有限。
(以下的幾種方法比較推薦使用)
第四種:雙層判斷加鎖,效率影響小且保證了線程安全。
public static MyInstance getsInstance() { if (instance == null) { synchronized (MyInstance.class) { if(instance==null){ instance=new MyInstance();
}
}
} return instance;
}
這種方法是對(duì)第二種和第三種方法的進(jìn)一步優(yōu)化,比較推薦使用。
第五種:內(nèi)部類實(shí)現(xiàn)單例,不用線程鎖來(lái)實(shí)現(xiàn)效率的提升。
public class MyInstance { private MyInstance() {
} public static MyInstance getInstance(){ return MyInstanceHolder.instance;
} private static class MyInstanceHolder{ private static MyInstance instance=new MyInstance();
}
}
在內(nèi)部類中new對(duì)象,再將內(nèi)部類的對(duì)象返回,這種方法是使用了java中class加載時(shí)互斥的原理來(lái)實(shí)現(xiàn)了線程的安全。不加線程鎖也使得運(yùn)行效率不會(huì)受到較大的影響。比較提倡。
本文主要記錄使用單例模式的幾種形式,并分析各自的優(yōu)缺點(diǎn)。使用單例模式可以避免重復(fù)創(chuàng)建對(duì)象,以此來(lái)節(jié)省開(kāi)銷,首先了解一下單例模式的四大原則:
常用的單例模式有:餓漢模式、懶漢模式、雙重鎖懶漢模式、靜態(tài)內(nèi)部類模式、枚舉模式,我們來(lái)逐個(gè)解釋這些模式的區(qū)別。
關(guān)于 volatile 修飾符,又是一個(gè)內(nèi)容,需要理解:
參考(有例子,比較好理解): ,
靜態(tài)內(nèi)部類單例模式的優(yōu)點(diǎn):
那么有人會(huì)問(wèn)了,如果有多個(gè)線程同時(shí)訪問(wèn) getInstance() 方法,會(huì)多次初始化類,然后創(chuàng)建多個(gè)對(duì)象嗎?答案是不會(huì)的,這我們需要了解一下類的加載機(jī)制:
虛擬機(jī)會(huì)保證一個(gè)類的clinit()方法在多線程環(huán)境中被正確地加鎖、同步,如果多個(gè)線程同時(shí)去初始化一個(gè)類,那么只會(huì)有一個(gè)線程去執(zhí)行這個(gè)類的clinit()方法,其他線程都需要阻塞等待,直到活動(dòng)線程執(zhí)行clinit()方法完畢。
所以如果一個(gè)類的clinit()方法中有耗時(shí)很長(zhǎng)的操作,就可能造成多個(gè)進(jìn)程阻塞(需要注意的是,其他線程雖然會(huì)被阻塞,但線程喚醒之后不會(huì)再次進(jìn)入clinit()方法。因?yàn)樵谕粋€(gè)加載器下,一個(gè)類只會(huì)初始化一次。)
所以靜態(tài)內(nèi)部類單例模式不僅能保證線程的安全性、實(shí)例的唯一性、還延遲了單例的實(shí)例化。
但是靜態(tài)內(nèi)部類單例模式也有一個(gè) 缺點(diǎn) ,就是無(wú)法傳遞參數(shù)。因?yàn)樗峭ㄟ^(guò)靜態(tài)內(nèi)部類的形式去創(chuàng)建單例的,所以外部就無(wú)法傳遞參數(shù)進(jìn)去。
枚舉單例模式占用的內(nèi)存是靜態(tài)變量的兩倍,所以一般都不使用enum來(lái)實(shí)現(xiàn)單例。
單例有餓漢模式、懶漢模式、雙重鎖懶漢模式、靜態(tài)內(nèi)部類模式、枚舉模式這幾種形式。
餓漢模式在初始化類時(shí)就創(chuàng)建了對(duì)象,容易造成資源浪費(fèi);懶漢模式在多線程環(huán)境下有風(fēng)險(xiǎn);枚舉模式占用內(nèi)存過(guò)高。這三種模式都有明顯的弊端,所以一般不去采用。
雙重鎖懶漢模式使用了 volatile 修飾符,在性能上會(huì)差一點(diǎn)點(diǎn);靜態(tài)內(nèi)部類模式無(wú)法傳遞參數(shù)。但是這兩種方式都能保證實(shí)例的唯一性,線程的安全性,也不會(huì)造成資源的浪費(fèi)。所以我們?cè)谑褂脝卫J綍r(shí),可以在這兩種方式中酌情選擇。
參考文章:
單例模式(Singleton)
一、 什么是單例模式
單例模式,簡(jiǎn)單點(diǎn)來(lái)說(shuō)就是設(shè)計(jì)一個(gè)類,使其在任何時(shí)候,最多只有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)這個(gè)實(shí)例的全局訪問(wèn)點(diǎn)。
二、 為什么要單例
在程序中的很多地方,只有一個(gè)實(shí)例是非常重要的。例如,在windows中,任務(wù)管理器只有一個(gè),無(wú)論你點(diǎn)擊多少次打開(kāi)任務(wù)管理器,任務(wù)管理器也只會(huì)生成一個(gè)窗口。再例如,在一些軟件中,工具箱是唯一的,無(wú)論你點(diǎn)擊多少次打開(kāi)工具箱,工具箱也只一個(gè)。
為什么要這樣設(shè)計(jì)呢?因?yàn)橄袢蝿?wù)管理器或工具箱這樣的程序,只要有一個(gè)就足夠完成所有的工作了,多個(gè)程序只會(huì)白白消耗系統(tǒng)資源,而像任務(wù)管理器這類的程序還會(huì)引入多個(gè)任務(wù)管理器之間的同步問(wèn)題,所以對(duì)些這些程序來(lái)說(shuō),只有一個(gè)實(shí)例或程序是必要的。
三、 為什么需要單例模式
上面講到對(duì)于某些程序來(lái)說(shuō),保持其只有一個(gè)實(shí)例是必要的,但是如何保證一個(gè)程序或一個(gè)類只有一個(gè)實(shí)例呢?下面從類的角度來(lái)解說(shuō)。
分享文章:android單例,android生命周期
當(dāng)前地址:http://chinadenli.net/article5/dseceii.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、微信公眾號(hào)、手機(jī)網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、定制開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)