简介:这些类无论实例化多少都是一样的; 这些类在整个应用中同一时刻只有一个状态
目的:节省内存,减少GC消耗总结:整个系统中只有一个实例存在
标准单例模式:public class Persion{ private Persion(){}; public static Persion getInstance(){ return PersionSingleton.persion; } private static class PersionSingleton{ static Persion persion = new Persion(); }}
标准单例模式优点:
1,Persion只有一个实例2,不会因并发产生多个实例 3,不会因JVM调优,出现还未正确初始化的实例JVM创建对象步骤:
1,分配内存 //new2,初始化构造器 //Persion()3,将对象指向已分配的内存地址 //Persion persion = 反例1:public class Singleton{ private static Singleton singleton; private Singleton(){}; public Singleton getInstance(){ if(singleton == null){ //判断null条件遇到并发问题,会出现多个实例化操作 singleton = new Singleton(); } return singleton; }}
反例2:
public class Singleton{ private static Singleton singleton; private Singleton(){}; public Singleton getInstance(){ if(singleton == null){ synchronized (Singleton.class){ if(singleton == null){ singleton = new Singleton(); //多线程情况下存在,第一个线程实例化释放锁后,第二个线程使用第一个线程实例化的对象会出现错误 } //因为第二个线程可能会使用到还没有完全创建好的实例(JVM内部调优会出现地址已分配但没有初始化的情况) } } return singleton; }}