1. 程式人生 > >7中單例模式實現小結

7中單例模式實現小結

原子 vol 暫時 socket static data instance 改進 cli

import java.net.Socket;
import java.sql.Connection;

public class Test {
    public static void main(String[] args){

    }
}

/*
    第14章 7中單例設計模式的設計

    評估標準:線程安全、高性能、懶加載
 */

/*
    14.1 餓漢式
 */
final class Singleton1{
    private byte[] data = new byte[1024];

    private Singleton1(){}

    
private static Singleton1 instance = new Singleton1(); public static Singleton1 getInstance(){ return instance; } } /* 14.2 懶漢式 */ final class Singleton2{ private byte[] data = new byte[1024]; private Singleton2(){} private static Singleton2 instance = null
; public static Singleton2 getInstance(){ if(instance==null){ instance=new Singleton2(); } return instance; } } /* 14.3 懶漢式+同步方法 性能低下 */ final class Singleton3 { private byte[] data = new byte[1024]; private Singleton3(){}
private static Singleton3 instance = null; public static synchronized Singleton3 getInstance(){ if(instance==null){ instance=new Singleton3(); } return instance; } } /* 14.4 Double-Check 首次初始化時加鎖,之後則允許多個線程同時進行getInstance方法的調用 但是的但是,這種方案還是存在問題!!! */ final class Singleton4{ private byte[] data = new byte[1024]; private static Singleton4 instance = null; private Singleton4(){} public static Singleton4 getInstance(){ if(null==instance){ synchronized (Singleton4.class){ if(null==instance){ /* 這個內部具體先初始化誰,我覺得一般人應該都 不知道吧,這個更像時一個答案,死記硬背的那 種。 */ instance=new Singleton4(); } } } return instance; } } /* 14.5 Volatile+Double-Check */ final class Singleton5{ private byte[] data = new byte[1024]; private volatile static Singleton5 instance = null; private Singleton5(){} public static Singleton5 getInstance(){ if(null==instance){ synchronized (Singleton5.class){ if(null==instance){ instance=new Singleton5(); } } } return instance; } } /********************************************************************* 14.6 Holder方式 在Singleton類中並滅有instance的靜態成員,而是將器放到了靜態內部類Holder之中 因此在Singleton類的初始化過程中並不會創建Singleton的實例,Holder類中定義了 Singleton的靜態變量,並且直接進行了實例化。當Holder被主動引用時,則會創建 Singleton的實例,Singleton實例的創建過程在Java程序編譯使其收集至<clinit>() 方法中,該方法又是同步方法,同步方法可以保證內存的可見性,JVM指令的順序性和原子 性。 */ final class Singleton6{ private byte[] data = new byte[1024]; private Singleton6(){} private static class Holder{ private static Singleton6 instance = new Singleton6(); } public static Singleton6 getInstance(){ return Holder.instance; } } /* **********************************************************************/ /* 14.7 枚舉方式 ——我對這部分不太熟練,暫時先不研究這部分吧 */ enum Singleton7{ INSTANCE; Singleton7(){ System.out.println("INSTANCE will be initialized immediately"); } public static void method(){ } public static Singleton7 getInstance(){ return INSTANCE; } } //改進後 enum Singleton7_1{ INSTANCE; Singleton7_1(){ System.out.println("INSTANCE will be initialized immediately"); } public static void method(){ } public static Singleton7_1 getInstance(){ return INSTANCE; } }

《Java高並發編程詳解》筆記

7中單例模式實現小結