單例模式:確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn)。
1、懶漢模式:
public class singleton { PRivate static singleton mSingleton; private singleton(){} public static singleton getInstance(){ if (mSingleton == null) { mSingleton = new singleton(); } return mSingleton; }}通過(guò)singleton mSingleton = singleton.getInstance();來(lái)獲取singleton的實(shí)例。這種模式是在需要的時(shí)候才會(huì)創(chuàng)建,如果在多線程中使用,會(huì)導(dǎo)致創(chuàng)建多個(gè)實(shí)例,這時(shí)候需要用同步鎖來(lái)確保只有一個(gè)實(shí)例。
2、同步鎖模式:
public class singleton { private static singleton mSingleton; private singleton(){} public static synchronized singleton getInstance(){ if (mSingleton == null) { mSingleton = new singleton(); } return mSingleton; }}雖然同步鎖可以解決多個(gè)實(shí)例的問(wèn)題,但是在使用過(guò)程中,每次調(diào)用實(shí)例,都需要同步,對(duì)程序的性能來(lái)說(shuō)有很大影響,有沒(méi)有辦法解決這個(gè)問(wèn)題呢,答案是肯定的,“雙重檢查加鎖”模式可以減少使用同步。
3、雙重檢查加鎖模式:
public class singleton { private static singleton mSingleton; private singleton(){} public static singleton getInstance(){ if (mSingleton == null) { synchronized (singleton.class) { if (mSingleton == null) { mSingleton = new singleton(); } } } return mSingleton; }}4、惡漢模式:
public class singleton { private static singleton mSingleton = new singleton(); private singleton(){} public static singleton getInstance(){ return mSingleton; }}Singleton實(shí)例在singleton類加載的時(shí)候就實(shí)例化,這種方式是最簡(jiǎn)單的方式,并且不存在多個(gè)實(shí)例的情況,也沒(méi)有線程同步的問(wèn)題,缺點(diǎn)是即使沒(méi)有使用該單例,它也會(huì)在類加載時(shí)被創(chuàng)建,浪費(fèi)內(nèi)存。
5、靜態(tài)內(nèi)部類:
public class singleton { private static class singletonHolder{ private static singleton mSingleton = new singleton(); } private singleton(){} public static singleton getInstance(){ return singletonHolder.mSingleton; }}這種方式同樣利用了類加載機(jī)制來(lái)保證只創(chuàng)建一個(gè)instance實(shí)例。它與餓漢模式一樣,也是利用了類加載機(jī)制,因此不存在多線程并發(fā)的問(wèn)題。不一樣的是,它是在內(nèi)部類里面去創(chuàng)建對(duì)象實(shí)例。這樣的話,只要應(yīng)用中不使用內(nèi)部類,JVM就不會(huì)去加載這個(gè)單例類,也就不會(huì)創(chuàng)建單例對(duì)象,從而實(shí)現(xiàn)懶漢式的延遲加載。也就是說(shuō)這種方式可以同時(shí)保證延遲加載和線程安全。
6、枚舉:
public enum singleton{ instance; private singleton(){}}在java中,為了強(qiáng)制只實(shí)例化一個(gè)對(duì)象,最好的方法是使用一個(gè)枚舉量。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注