/*** * 懶漢模式 1 * 能夠延遲加載,但線程不安全。 * @author admin * */ public class TestSinleton1 { private static TestSinleton1 sinleton; private TestSinleton1(){ } public static TestSinleton1 getSinleton(){ if(sinleton==null){ return new TestSinleton1(); } return sinleton; } } /*** * 懶漢模式變種 2 * @author admin * 使用了synchronized關鍵字,既能夠延遲加載,又線程安全,可是執行效率低。 */ class TestSinleton2{ private static TestSinleton2 sinleton; private TestSinleton2(){ } public synchronized static TestSinleton2 getSinleton(){ if(sinleton==null){ return new TestSinleton2(); } return sinleton; } } /*** * 餓漢模式 3 * @author admin * 基於classload機制,靜態變量在類裝載時進行初始化 * 能夠避免線程安全問題,可是沒有延遲加載。 */ class TestSinleton3{ private static TestSinleton3 sinleton = new TestSinleton3(); private TestSinleton3(){ } public static TestSinleton3 getSinleton(){ return sinleton; } } /*** * 惡漢變種模式 4 * @author admin * 基於靜態 代碼塊,在實例化或者第一次調用時執行 * 既能夠延遲加載,又線程安全 */ class TestSinleton4{ private static TestSinleton4 sinleton =null; static{ sinleton = new TestSinleton4(); } public static TestSinleton4 getSinleton(){ return sinleton; } } /*** * 雙重校驗鎖 5 * @author admin * 懶漢模式的優化版,擁有線程安全、高效率以及延遲加載等特性。可是這種方式須要jdk1.5以上,且在一些平臺和編譯器下有錯。 */ class TestSinleton5{ private static volatile TestSinleton5 sinleton; private TestSinleton5(){ } public static TestSinleton5 getSinleton(){ if(sinleton==null){ synchronized (TestSinleton5.class) { if(sinleton==null){ sinleton = new TestSinleton5(); } } } return sinleton; } } /*** * 靜態內部類 6 * @author admin * 惡漢模式的優化版,在類被裝載時,靜態內部類並無被實例化, * 只有getInstance()時才 會裝載 SingletonHolder 類,靜態內部類方式也能很好地,實現線程安全、高效率和延遲加載特性。 */ class TestSinleton6{ private static class SingletonHolder { private static final TestSinleton6 sinleton = new TestSinleton6(); } private TestSinleton6(){} public static final TestSinleton6 getSinleton(){ return SingletonHolder.sinleton; } } /*** * 枚舉7 * @author admin *避免多線程同步問題 */ enum TestSinleton7 { SINLETON; }