PS:首先我們要先知道什么是單例,為什么要用單例,用的好處是什么等問(wèn)題來(lái)看。
成都創(chuàng)新互聯(lián)公司云計(jì)算的互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)13年的服務(wù)器租用、綿陽(yáng)電信機(jī)房、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn),已先后獲得國(guó)家工業(yè)和信息化部頒發(fā)的互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)許可證。專業(yè)提供云主機(jī)、虛擬主機(jī)、申請(qǐng)域名、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
1:java中單例模式是一種常見(jiàn)的設(shè)計(jì)模式,單例模式的寫(xiě)法有好幾種,這里主要介紹兩種:懶漢式單例、餓漢式單例
單例模式有以下特點(diǎn):
1、單例類只能有一個(gè)實(shí)例。
2、單例類必須自己創(chuàng)建自己的唯一實(shí)例。
3、單例類必須給所有其他對(duì)象提供這一實(shí)例。
單例模式確保某個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。在計(jì)算機(jī)系統(tǒng)中,線程池、緩存、日志對(duì)象、對(duì)話框、打印機(jī)、顯卡的驅(qū)動(dòng)程序?qū)ο蟪1辉O(shè)計(jì)成單例。這些應(yīng)用都或多或少具有資源管理器的功能。每臺(tái)計(jì)算機(jī)可以有若干個(gè)打印機(jī),但只能有一個(gè)Printer Spooler,以避免兩個(gè)打印作業(yè)同時(shí)輸出到打印機(jī)中。每臺(tái)計(jì)算機(jī)可以有若干通信端口,系統(tǒng)應(yīng)當(dāng)集中管理這些通信端口,以避免一個(gè)通信端口同時(shí)被兩個(gè)請(qǐng)求同時(shí)調(diào)用。總之,選擇單例模式就是為了避免不一致?tīng)顟B(tài),避免政出多頭。
2:懶漢式
先把單例類寫(xiě)出來(lái)
public class SingletonTest {
//懶漢式單例類.在第一次調(diào)用的時(shí)候?qū)嵗约?
private SingletonTest() {}
private static SingletonTest single=null;
//靜態(tài)工廠方法
public static SingletonTest getInstance() {
if (single == null) {
single = new SingletonTest();
System.out.println("創(chuàng)建一次");
}
return single;
}
public void show(){
System.out.println("我是show");
}
}
這里直接上代碼,代碼中有詳解
public class SingletonTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//故意寫(xiě)獲取兩次,創(chuàng)建兩個(gè)對(duì)象
SingletonTest singleton=SingletonTest.getInstance();
SingletonTest singleton2=SingletonTest.getInstance();
//Singleton對(duì)象只創(chuàng)建一次,但是寫(xiě)兩次還是可以的,而且方法都是可以調(diào)用的,但是看下面
singleton.show();
singleton2.show();
//兩個(gè)對(duì)象的表現(xiàn)形式一樣
if(singleton == singleton2){
System.out.println("該對(duì)象的字符串表示形式:");
System.out.println("singleton :"+singleton.toString());
System.out.println("singleton2:"+singleton2.toString());
}

由上面的圖可以看出就算多創(chuàng)建幾個(gè)對(duì)象,在底部也是只有一個(gè)singleton對(duì)象實(shí)例,而且創(chuàng)建出來(lái)的對(duì)象的字符串表現(xiàn)形式也是一樣的,有的人肯定有疑問(wèn),那平常兩個(gè)對(duì)象是什么樣子的呢,我下面給你解釋說(shuō)明,在這之前我寫(xiě)說(shuō)一下這個(gè)懶漢式需要注意的地方,它是線程不安全的,并發(fā)環(huán)境下很可能出現(xiàn)多個(gè)Singleton實(shí)例,有很多方法可以解決,比如說(shuō)同步鎖,靜態(tài)內(nèi)部類等,這里主要說(shuō)靜態(tài)內(nèi)部類,這個(gè)比較好點(diǎn),
public class Singleton3 {
private static class SingletonHolder {
private static final Singleton3 INSTANCE = new Singleton3();
}
private Singleton3 (){}
public static final Singleton3 getInstance() {
System.out.println("singleton創(chuàng)建");
return SingletonHolder.INSTANCE;
}
}
調(diào)用:
Singleton3 singleton3=Singleton3.getInstance();
Singleton3 singleton4=Singleton3.getInstance();
if(singleton3 == singleton4){
System.out.println("該對(duì)象的字符串表示形式:");
System.out.println("singleton3:"+singleton3.toString());
System.out.println("singleton4:"+singleton4.toString());
}
結(jié)果圖:

這里我也是創(chuàng)建了兩個(gè)對(duì)象來(lái)說(shuō)明,神奇的是打印了兩次singleton創(chuàng)建,這難道是又創(chuàng)建成功了的對(duì)象嗎?答案是:雖然打印了兩次,對(duì)象名也有兩個(gè),但是該對(duì)象的字符串表示形式還是一樣的,而且大家都知道static的用法,就是在類被加載的同時(shí)該singleton對(duì)象就已經(jīng)被創(chuàng)建,后期不會(huì)再被創(chuàng)建,就算后期自己又調(diào)用了getInstance()方法,但底層還是公用的一個(gè)Singleton對(duì)象.
同樣,我寫(xiě)了一個(gè)普通的類,來(lái)同時(shí)創(chuàng)建兩個(gè)對(duì)象,并且打印他們的toString()方法,如下:
QuBie qb1=new QuBie();
QuBie qb2=new QuBie();
if(qb1 == qb2){
System.out.println("該對(duì)象的字符串表示形式:");
System.out.println("singleton3:"+qb1.toString());
System.out.println("singleton4:"+qb2.toString());
}else{
System.out.println("該對(duì)象的字符串表示形式:");
System.out.println("singleton3:"+qb1.toString());
System.out.println("singleton4:"+qb2.toString());
}

由此可看出來(lái)對(duì)象的字符串表示形式是不一樣的
3:餓漢式單例
餓漢式單例類.在類初始化時(shí),已經(jīng)自行實(shí)例化
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//靜態(tài)工廠方法
public static Singleton1 getInstance() {
return single;
}
}
因?yàn)檫@本身就是static修飾的方法,所以是在類加載的時(shí)候被創(chuàng)建,后期不會(huì)再改變,所以線程是安全的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
網(wǎng)站名稱:圖文結(jié)合講解Java單例模式
當(dāng)前URL:http://www.chinadenli.net/article18/pecidp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、網(wǎng)站策劃、云服務(wù)器、網(wǎng)站設(shè)計(jì)、手機(jī)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站
聲明:本網(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)