第一種形式:懶漢式损痰,也是常用的形式逼肯。
publicclassSingletonClass{
privatestaticSingletonClass?instance=null;
publicstaticsynchronizedSingletonClass?getInstance(){
if(instance==null){
instance=newSingletonClass();
}
returninstance;
}
privateSingletonClass(){
}
}
第二種形式:餓漢式
//對(duì)第一行static的一些解釋
//?java允許我們?cè)谝粋€(gè)類(lèi)里面定義靜態(tài)類(lèi)了牛。比如內(nèi)部類(lèi)(nested?class)窒朋。
//把nested?class封閉起來(lái)的類(lèi)叫外部類(lèi)寓辱。
//在java中,我們不能用static修飾頂級(jí)類(lèi)(top?level?class)蚊荣。
//只有內(nèi)部類(lèi)可以為static初狰。
publicclassSingleton{
//在自己內(nèi)部定義自己的一個(gè)實(shí)例,只供內(nèi)部調(diào)用
privatestaticfinal?Singleton?instance?=newSingleton();
privateSingleton(){
//do?something
}
//這里提供了一個(gè)供外部訪問(wèn)本class的靜態(tài)方法妇押,可以直接訪問(wèn)
publicstaticSingleton?getInstance(){
returninstance;
}
}
第三種形式: 雙重鎖的形式
publicclassSingleton{
privatestaticvolatileSingleton?instance=null;
privateSingleton(){
//do?something
}
publicstaticSingleton?getInstance(){
if(instance==null){
synchronized(SingletonClass.class){
if(instance==null){
instance=newSingleton();
}
}
}
returninstance;
}
}
//這個(gè)模式將同步內(nèi)容下方到if內(nèi)部跷究,提高了執(zhí)行的效率姓迅,不必每次獲取對(duì)象時(shí)都進(jìn)行同步敲霍,只有第一次才同步俊马,創(chuàng)建了以后就沒(méi)必要了。
//這種模式中雙重判斷加同步的方式肩杈,比第一個(gè)例子中的效率大大提升柴我,因?yàn)槿绻麊螌觟f判斷,在服務(wù)器允許的情況下扩然,
//假設(shè)有一百個(gè)線程艘儒,耗費(fèi)的時(shí)間為100*(同步判斷時(shí)間+if判斷時(shí)間),而如果雙重if判斷夫偶,100的線程可以同時(shí)if判斷界睁,理論消耗的時(shí)間只有一個(gè)if判斷的時(shí)間。
//所以如果面對(duì)高并發(fā)的情況兵拢,而且采用的是懶漢模式翻斟,最好的選擇就是雙重判斷加同步的方式。