多線程安全單例模式實(shí)例一(不使用同步鎖)
代碼中的一個(gè)缺點(diǎn)是該類加載的時(shí)候就會(huì)直接new 一個(gè)靜態(tài)對(duì)象出來,當(dāng)系統(tǒng)中這樣的類較多時(shí),會(huì)使得啟動(dòng)速度變慢 。現(xiàn)在流行的設(shè)計(jì)都是講“延遲加載”,我們可以在第一次使用的時(shí)候才初始化第一個(gè)該類對(duì)象。所以這種適合在小系統(tǒng)。
public class Singleton {
private static Singleton sin=new Singleton(); ///直接初始化一個(gè)實(shí)例對(duì)象
private Singleton(){ ///private類型的構(gòu)造函數(shù),保證其他類對(duì)象不能直接new一個(gè)該對(duì)象的實(shí)例
}
public static Singleton getSin(){ ///該類唯一的一個(gè)public方法
return sin;
}
}
多線程安全單例模式實(shí)例二(使用同步方法)
代碼中的一次鎖住了一個(gè)方法, 這個(gè)粒度有點(diǎn)大 ,改進(jìn)就是只鎖住其中的new語句就OK。就是所謂的“雙重鎖”機(jī)制。
public class Singleton {
private static Singleton instance;
private Singleton (){
}
public static synchronized Singleton getInstance(){ //對(duì)獲取實(shí)例的方法進(jìn)行同步
if (instance == null)
instance = new Singleton();
return instance;
}
}
多線程安全單例模式實(shí)例三(使用雙重同步鎖)
public class Singleton {
private static Singleton instance;
private Singleton (){
}
public static Singleton getInstance(){ //對(duì)獲取實(shí)例的方法進(jìn)行同步
if (instance == null){
synchronized(Singleton.class){
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}