|
解法一:只適合單線程環(huán)境(不好) package test; /** * @author xiaoping * */ public class Singleton { private static Singleton instance=null; private Singleton(){ } public static Singleton getInstance(){ if(instance==null){ instance=new Singleton(); } return instance; } } 注解:Singleton的靜態(tài)屬性instance中,只有instance為null的時(shí)候才創(chuàng)建一個(gè)實(shí)例,構(gòu)造函數(shù)私有,確保每次都只創(chuàng)建一個(gè),避免重復(fù)創(chuàng)建。 解法二:多線程的情況可以用。(懶漢式,不好) public class Singleton { private static Singleton instance=null; private Singleton(){ } public static synchronized Singleton getInstance(){ if(instance==null){ instance=new Singleton(); } return instance; } } 注解:在解法一的基礎(chǔ)上加上了同步鎖,使得在多線程的情況下可以用。例如:當(dāng)兩個(gè)線程同時(shí)想創(chuàng)建實(shí)例,由于在一個(gè)時(shí)刻只有一個(gè)線程能得到同步鎖,當(dāng)?shù)谝粋€(gè)線程加上鎖以后,第二個(gè)線程只能等待。第一個(gè)線程發(fā)現(xiàn)實(shí)例沒有創(chuàng)建,創(chuàng)建之。第一個(gè)線程釋放同步鎖,第二個(gè)線程才可以加上同步鎖,執(zhí)行下面的代碼。由于第一個(gè)線程已經(jīng)創(chuàng)建了實(shí)例,所以第二個(gè)線程不需要?jiǎng)?chuàng)建實(shí)例。保證在多線程的環(huán)境下也只有一個(gè)實(shí)例。 解法三:加同步鎖時(shí),前后兩次判斷實(shí)例是否存在(可行) public class Singleton { private static Singleton instance=null; private Singleton(){ } public static Singleton getInstance(){ if(instance==null){ synchronized(Singleton.class){ if(instance==null){ instance=new Singleton(); } } } return instance; } } 注解:只有當(dāng)instance為null時(shí),需要獲取同步鎖,創(chuàng)建一次實(shí)例。當(dāng)實(shí)例被創(chuàng)建,則無需試圖加鎖。 解法四:餓漢式(建議使用) public class Singleton { private static Singleton instance=new Singleton(); private Singleton(){ } public static Singleton getInstance(){ return instance; } } 注解:初試化靜態(tài)的instance創(chuàng)建一次。如果我們在Singleton類里面寫一個(gè)靜態(tài)的方法不需要?jiǎng)?chuàng)建實(shí)例,它仍然會(huì)早早的創(chuàng)建一次實(shí)例。而降低內(nèi)存的使用率。 缺點(diǎn):沒有l(wèi)azy loading的效果,從而降低內(nèi)存的使用率。 解法五:靜態(tài)內(nèi)部內(nèi)。(建議使用) public class Singleton { private Singleton(){ } private static class SingletonHolder{ private final static Singleton instance=new Singleton(); } public static Singleton getInstance(){ return SingletonHolder.instance; } } 注解:定義一個(gè)私有的內(nèi)部類,在第一次用這個(gè)嵌套類時(shí),會(huì)創(chuàng)建一個(gè)實(shí)例。而類型為SingletonHolder的類,只有在Singleton.getInstance()中調(diào)用,由于私有的屬性,他人無法使用SingleHolder,不調(diào)用Singleton.getInstance()就不會(huì)創(chuàng)建實(shí)例。
|
|
|