当前位置: 首页 > 后端技术 > Java

单例模式

时间:2023-04-01 13:40:37 Java

LazyMode/***@DescriptionLazyMode实现了延迟加载,但是效率较低*/publicclassLazySingleton{privatestaticLazySingletonlazySingleton;privateLazySingleton(){}publicsynchronizedstaticLazySingletongetLazySingleton(){if(lazySingleton==null){lazySingleton=newLazySingleton();}返回lazySingleton;}publicstaticvoidmain(String[]args){LazySingletonh1=LazySingleton.getLazySingleton();LazySingletonh2=LazySingleton.getLazySingleton();==h2);}}饿汉模式1/***@Description饿汉模式*类加载时实例化完成,避免多线程同步问题*/publicclassHungrySingleton{privatestaticHungrySingletonsingleton=newHungrySingleton();privateHungrySingleton(){}publicstaticHungrySingletongetSingleton(){returnsingleton;}publicstaticvoidmain(String[]args){HungrySingletonh1=HungrySingleton.getSingleton();HungrySingletonh2=HungrySingleon.getSingleton();System.out.println(h1==h2);}}双重验证锁模式/***@description:1.懒加载,2volatile保证指令不会重排*/publicclassDoubleCheckSingleton{privatevolatilestaticDoubleCheckSingletonsingleton;privateDoubleCheckSingleton(){}publicstaticDoubleCheckSingletongetInstance(){if(singleton==null){synchronized(DoubleCheckSingleton.class){newif(singleton==null){Singleton==null);}}}返回单例;}publicstaticvoidmain(String[]args){DoubleCheckSingletond1=DoubleCheckSingleton.getInstance();DoubleCheckSingletond2=DoubleCheckSingleton.getInstance();System.out.println(d1==d2);}单例=新的DoubleCheckSingleton();实际过程分为3步1.为单例分配内存空间2.初始化单例3.单例指向分配的内存地址由于jvm具有指令重排的特性,指令可能变成1->3->2。指令重排在单线程中不会出现问题,但在多线程环境中,会导致一个线程使用volatile获取未初始化的实例可以禁止指令重排,在多线程环境下也可以正常运行内部类模式/****@description:内部类不会在加载外部类的时候加载,只有在加载外部类的时候才会加载使用内部类,保证延迟加载*class加载时实例化对象,不会引起线程安全问题*/publicclassInnerClassSingleton{privateInnerClassSingleton(){}privatestaticclassinnerInstance{privatestaticfinalInnerClassSingletonsingleton=newInnerClassSingleton();}publicstaticInnerClassSingletongetInstance(){返回innerInstance.singleton;}publicstaticvoidmain(String[]args){InnerClassSingletoni1=InnerClassSingleton.getInstance();InnerClassSingletoni2=InnerClassSingleton.getInstance();System.out.println(i1==i2);}}