單例模式的寫(xiě)法有多種最簡(jiǎn)單的就是懶漢式的寫(xiě)法感昼,但是懶漢式的寫(xiě)法在多線程中會(huì)出問(wèn)題针姿。下面總結(jié)寫(xiě)我常用的兩種寫(xiě)法朱庆。
1. 使用volatile 關(guān)鍵字聲明寫(xiě)法
? ? public class SignalDemo1 {? ? ? ?
? ? ? ? public static volatile SignalDemo1 instance;
? ? ? ? private SignalDemo1()? {
? ? ? }
? ? ? public static SignalDemo1 getInstance( ){
? ? ? ? if( instance == null) {
? ? ? ? ? ? ? synchronized (SignalDemo1.class) {
? ? ? ? ? ? ? ? if (instance == null) {
? ? ? ? ? ? ? ? ? ? instance = new SignalDemo1();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? }
? ? ? ? return instance;
? ? }
}
? ? 這種寫(xiě)法的好處就是不會(huì)在多線程中調(diào)用getInstance()方法出現(xiàn)多實(shí)例的特殊情況罐韩。也是我經(jīng)常使用的。下面的寫(xiě)法是 Effect Java 第一版中的單例寫(xiě)法,我感覺(jué)寫(xiě)的很巧妙赠橙。第二版中用的枚舉類(lèi)型耽装,雖然代碼更加精簡(jiǎn)但是不容易理解。這里以第一版的寫(xiě)法為主期揪。
2. Effect Java 第一版推薦的單例模式寫(xiě)法
? ? public class SingleDemo2 {
? ? ? private SingleDemo2( ){
? ? }
? ? private static class SingleHolder{
? ? ? ? private static finale SingleDemo2 instance = new SingleDemo2( );
? ? }
? ? public static SingelDemo2 getInstance ( ){
? ? ? ? ? return SingleHolder.instance;
? ? }
}
? ? 這種寫(xiě)法的好處是巧妙的利用了靜態(tài)內(nèi)部類(lèi)掉奄。