您好,登錄后才能下訂單哦!
這篇“如何用java代碼實(shí)現(xiàn)高性能單例模式”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“如何用java代碼實(shí)現(xiàn)高性能單例模式”文章吧。
單例是指:無(wú)論你創(chuàng)建了多少個(gè)引用,在堆中僅僅只有一個(gè)實(shí)例。
例如,
Person p1 = ... ;
Person p1 = ...;
在單例模式下,必須保證p1==p2。因?yàn)閱卫WCp1和p2兩個(gè)引用指向的是同一個(gè)實(shí)例,即引用地址是相同的。
單例模式的寫法也有很多種:線程不安全的懶漢式、線程安全的懶漢式、線程安全的餓漢式、登記式等等。但從實(shí)踐的角度來(lái)看,用的最多的也就只有兩種方式:枚舉式和雙重檢查式。
其中,枚舉式的單例模式只需要一行代碼,堪稱居家旅行必備神器~如下所示。
public enum Singleton{ INSTANCE; }
OK,寫完了,不信來(lái)測(cè)試一下。
public enum Singleton{
INSTANCE;
public void method(){
System.out.println("業(yè)務(wù)方法...");
}
}
class Test{
public static void main(String[] args) {
Singleton ins1 = Singleton.INSTANCE;
Singleton ins2 = Singleton.INSTANCE;
System.out.println(ins1 == ins2);
ins1.method();
}
}
運(yùn)行結(jié)果:
true
業(yè)務(wù)方法...
原理:枚舉類型 是天然的單例。
除了以上枚舉式的單例模式以外,另一種推薦的單例寫法就是 雙重檢查式單例,源碼如下:
public class SingletonD {
private volatile static SingletonD instance = null;
private SingletonD() {
}
public static SingletonD getInstance() {
if (instance == null) {
synchronized (SingletonD.class) {
if (instance == null)
instance = new SingletonD();
}
}
return instance;
}
}
對(duì)以上源碼進(jìn)行兩點(diǎn)說明:
源碼中有兩個(gè)if判斷,第一個(gè)if是為了減少if代碼塊的執(zhí)行次數(shù)(如果instance不為null,就不需要再執(zhí)行if代碼塊),從而提升性能;第二個(gè)if是在加鎖后的判斷,目的是為了保證instance只會(huì)被new一次。這種寫法有兩個(gè)if,因此稱為雙重加鎖。
instance = new SingletonD()不是一個(gè)原子性操作,可能會(huì)被JVM重排序,從而造成線程安全問題。因此需要給成員變量instance加上volatile關(guān)鍵字,用于防止重排序的發(fā)生。
以上就是關(guān)于“如何用java代碼實(shí)現(xiàn)高性能單例模式”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。