java bean 单例模式_单例模式 - Beans_bag - 博客园
1、單例模式的簡介
定義
保證每個類僅有一個實例,并給外部提供一個訪問它的全局訪問點。
思路
如果一個類能夠被創(chuàng)建多個實例,那么,這個類的構(gòu)造方法肯定是公開的,外部通過此類的構(gòu)造方法可以創(chuàng)建多個類的實例。只要類的構(gòu)造方法能讓外部訪問到,我們就沒法控制類的實例的個數(shù)。
如果我們把創(chuàng)建類的實例的權(quán)限收回來,讓類自身負(fù)責(zé)創(chuàng)建實例,然后由類本身來提供外部訪問這個類的實例的方法,就實現(xiàn)了單例模式。
在Java中,單例模式的實現(xiàn)分為兩種,一種是懶漢式,另一種是餓漢式。區(qū)別在于具體創(chuàng)建對象實例的處理上,有不同的方式。
懶漢式
/*** 懶漢式
*@authorBean_bag*/
public classSingleton {//存儲創(chuàng)建好的實例對象
private static Singleton uniqueInstance = null;//私有化構(gòu)造方法
privateSingleton(){}//為外部提供類實例
public static synchronizedSingleton getInstance(){//判斷變量是否有值
if (uniqueInstance == null){//沒有值,就創(chuàng)建對象并賦值
uniqueInstance = newSingleton();
}//有值就直接使用
returnuniqueInstance;
}
}
餓漢式
/*** 餓漢式
*@authorBean_bag*/
public classSingleton {private static Singleton uniqueInstance = newSingleton();//私有化構(gòu)造方法
privateSingleton(){}//定義一個方法來為客戶端提供類實例
public staticSingleton getInstance(){returnuniqueInstance;
}
}
2、單例模式的詳解
功能
保證類在運行期間只會創(chuàng)建一個實例,并提供了一個全局唯一的訪問這個類的訪問點,就是代碼中的getInstance()方法。不管懶漢式還是餓漢式,這個訪問點是一樣的。對單例模式本身而言,它只關(guān)心類實例的創(chuàng)建問題,并不關(guān)心具體的業(yè)務(wù)問題。
范圍
目前Java里面實現(xiàn)的單例是一個ClassLoader及其子ClassLoader的范圍,因為一個ClassLoader在裝載餓漢式單例的時候,就會創(chuàng)建一個類的實例。如果一個虛擬機里面有多個ClassLoader,而這些ClassLoader都裝載某個類的話,就算這個類是單例類,也會產(chǎn)生很多個實例。如果一個機器上有多個虛擬機,那么每個虛擬機里都應(yīng)該至少有一個這個類的實例,整個機器上有多個實例,就不再是單例了。
關(guān)于ClassLoader的更多介紹請自行查閱相關(guān)資料。
優(yōu)缺點
懶漢式是典型的時間換空間。每次獲取實例都會進(jìn)行判斷,判斷是否需要創(chuàng)建實例,浪費判斷的時間。如果沒人使用,就不會創(chuàng)建實例,節(jié)省內(nèi)存空間。
餓漢式是典型的時間換空間,不管是否使用,都創(chuàng)建出來,每次調(diào)用的時候,就不再去判斷,節(jié)省了運行時間。
線程安全
不加同步的懶漢式是線程不安全的
餓漢式是線程安全的,因為虛擬機保證了只會裝載一次,在裝載類的時候是不會發(fā)生并發(fā)的。
3、Java中一種更好的單例實現(xiàn)方式
public classSingleton {/*** 類級的內(nèi)部類,也就是靜態(tài)的成員式內(nèi)部類,該內(nèi)部類的實例與外部類的實例
* 沒有綁定關(guān)系,而且只有被調(diào)用到才會裝載,從而實現(xiàn)了延遲加載*/
private static classSingleHolder{private static Singleton instance = newSingleton();
}/*** 私有化構(gòu)造方法*/
privateSingleton(){}public staticSingleton getInstance(){returnSingleHolder.instance;
}
}
當(dāng)getInstance()方法在第一次調(diào)用的時候,它第一次讀取SingleHolder.instance,導(dǎo)致SingleHolder類得到初始化。而這個類在裝載并初始化的時候,會初始化它的靜態(tài)域,從而創(chuàng)建Singleton實例。由于是靜態(tài)的域,因此只會被虛擬機在裝載類的時候初始化一次,有虛擬機來保證它的線程安全性。
總結(jié)
以上是生活随笔為你收集整理的java bean 单例模式_单例模式 - Beans_bag - 博客园的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript如何实现确认后提交
- 下一篇: java中的与或非_与或非 · java