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高并发编程详解》笔记