組建網(wǎng)站 多少錢(qián)南京seo域名
單例模式
1.單例模式含義
單例模式就是保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)。
其實(shí)單例模式很好理解,當(dāng)我們new一個(gè)對(duì)象實(shí)例的時(shí)候,這個(gè)對(duì)象會(huì)被放到一個(gè)內(nèi)存中,當(dāng)我們?cè)俅蝞ew同一個(gè)對(duì)象的實(shí)例的時(shí)候,此時(shí)系統(tǒng)就又會(huì)為我們新創(chuàng)建的這個(gè)對(duì)象分配一個(gè)新的內(nèi)存。這就是普通的對(duì)象創(chuàng)建方式,單例模式呢就是,無(wú)論我們創(chuàng)建多少次對(duì)象,所有的創(chuàng)建出來(lái)的對(duì)象,都指向同一個(gè)內(nèi)存,都是同一個(gè)對(duì)象。
2.代碼示例
2.1Singleton類
Singleton類是目標(biāo)類,就是我們要new的對(duì)象
public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance(){if (instance == null) {instance = new Singleton();}return instance;}
}
2.2測(cè)試類
public class MainApp {public static void main(String[] args) {Singleton instance1 = Singleton.getInstance();Singleton instance2 = Singleton.getInstance();System.out.println("instance1的內(nèi)存地址:" + instance1);System.out.println("instance2的內(nèi)存地址:" + instance2);}
}
運(yùn)行結(jié)果
instance1的內(nèi)存地址:com.dalei.singleton.Singleton@1b6d3586
instance2的內(nèi)存地址:com.dalei.singleton.Singleton@1b6d3586
從運(yùn)行結(jié)果可以看到,雖然我們創(chuàng)建了兩個(gè)Singleton對(duì)象的實(shí)例,但是這兩個(gè)實(shí)例所指向的內(nèi)存地址是一模一樣的,也就是說(shuō)這兩個(gè)實(shí)例是相等的,是同一個(gè)。
3.總結(jié)
單例模式的目的就是為了讓一個(gè)類自始至終都僅保持唯一的一個(gè)實(shí)例。這個(gè)類可以保證沒(méi)有其他實(shí)例可以被創(chuàng)建,并且它可以提供一個(gè)訪問(wèn)該實(shí)例的方法。
單例模式有兩種初始化方式,一種餓漢式,一種懶漢式
-
餓漢式:就是在類被加載的時(shí)候就將自己實(shí)例化出來(lái)
餓漢式使用,會(huì)提前占用系統(tǒng)資源,但是不會(huì)出現(xiàn)多線程問(wèn)題,因?yàn)榫€程工作前,這個(gè)單例對(duì)象已經(jīng)被創(chuàng)建好了。
-
懶漢式:就是在第一次引用這個(gè)類的時(shí)候,才將自己實(shí)例化
懶漢式使用,不會(huì)提前占用系統(tǒng)資源,但是會(huì)出現(xiàn)多線程問(wèn)題,要做好線程并發(fā)控制,否則對(duì)象就會(huì)創(chuàng)建多個(gè)出來(lái)。
這兩種實(shí)例化的方式,區(qū)別就是加載時(shí)機(jī)不同。
綜上,單例模式是為了讓我們?cè)谌魏螘r(shí)候任何地方引用到的都是同一個(gè)對(duì)象,如果想要實(shí)現(xiàn)這個(gè)效果,那單例模式就是很好的解決方法。不過(guò)使用單例模式的時(shí)候要注意避免多線程并發(fā)問(wèn)題,解決多線程并發(fā)的方法很多種,加鎖,使用枚舉等等,此處不做深入討論。