單例模式
目錄
image
定義:用來創(chuàng)建獨一無二的,只能有一個實例的對象的入場券
作用:用于減少由于創(chuàng)建過多相同對象而造成的資源浪費
應(yīng)用場景:常常用來管理共享資源浴栽,如數(shù)據(jù)庫操作和線程池茫死。
實現(xiàn)方法:
1,餓漢式
在創(chuàng)建變量的時候就將對象實例化,另外通過將構(gòu)造器私有化來防止對象的重復(fù)創(chuàng)建椭豫。
優(yōu)點:可以防止由于多線程操作所產(chǎn)生的操作
缺點:過早的創(chuàng)建對象可能會造成資源的浪費
public class Single {
private static final Single single=new Single();
private Single(){}
public static Single getInstance(){
return single;
}
}
2,懶漢式
當(dāng)需要的時候再創(chuàng)建對象
優(yōu)點:當(dāng)需要的時候再創(chuàng)建對象浆熔,防止的資源的浪費
缺點:可能會因為多線程的操作而產(chǎn)生錯誤
public class Single {
private static Single single;
private Single(){};
public static Single getInstance(){
if(single==null){
single=new Single();
}
return single;
}
}
解決方法:
1,加上同步修飾符
優(yōu)點:防止多線程所造成的的錯誤
缺點:每次調(diào)用getInstance()方法同步都會成為一種累贅
public synchronized static Single getInstance(){
if(single==null){
single=new Single();
}
return single;
}
2宏侍,雙重鎖定
優(yōu)點:防止多線程所造成的的錯誤,還能降低同步所造成的累贅
缺點:volatile修飾符在1.4及更早版本中會使雙重鎖定失效
注意:volatile修飾符在這里是為了確保當(dāng)single被創(chuàng)建為Single實例時蜀漆,多個線程能夠正確的處理single變量
public class Single {
private volatile static Single single;
private Single(){};
public static Single getIntance(){
if(single==null){
synchronized(Single.class){
if(single==null){
single=new Single();
}
}
}
return single;
}
}