- 懒汉模式
/** * @Description 懒汉模式 实现了提早加载,然而效率较低 * @Author wanghognbo * @Date 2021/9/1 */public class LazySingleton { private static LazySingleton lazySingleton; private LazySingleton(){ } public synchronized static LazySingleton getLazySingleton(){ if(lazySingleton == null){ lazySingleton = new LazySingleton(); } return lazySingleton; } public static void main(String[] args) { LazySingleton h1 = LazySingleton.getLazySingleton(); LazySingleton h2 = LazySingleton.getLazySingleton(); System.out.println(h1==h2); }}
- 饿汉模式
1/** * @Description 饿汉模式 * 类加载时实现实例化,防止多线程同步问题 * 使类加载的状况有多种, 所以可能造成空间节约 */public class HungrySingleton { private static HungrySingleton singleton = new HungrySingleton(); private HungrySingleton(){ } public static HungrySingleton getSingleton(){ return singleton; } public static void main(String[] args) { HungrySingleton h1 = HungrySingleton.getSingleton(); HungrySingleton h2 = HungrySingleton.getSingleton(); System.out.println(h1==h2); }}
- 双重校验锁模式
/**** @description: 1.懒加载, 2 volatile 保障了指令不会重排*/public class DoubleCheckSingleton { private volatile static DoubleCheckSingleton singleton; private DoubleCheckSingleton() { } public static DoubleCheckSingleton getInstance(){ if(singleton == null){ synchronized (DoubleCheckSingleton.class){ if(singleton == null){ singleton = new DoubleCheckSingleton(); } } } return singleton; } public static void main(String[] args) { DoubleCheckSingleton d1 = DoubleCheckSingleton.getInstance(); DoubleCheckSingleton d2 = DoubleCheckSingleton.getInstance(); System.out.println(d1==d2); }}
- 外部类模式
/**** @description: 外部类加载时不会加载外部类,应用外部类时才会加载, 保障了懒加载 * 类加载时实例化对象,不会造成线程平安问题*/public class InnerClassSingleton { private InnerClassSingleton(){ } private static class innerInstance { private static final InnerClassSingleton singleton = new InnerClassSingleton(); } public static InnerClassSingleton getInstance(){ return innerInstance.singleton; } public static void main(String[] args) { InnerClassSingleton i1 = InnerClassSingleton.getInstance(); InnerClassSingleton i2 = InnerClassSingleton.getInstance(); System.out.println(i1==i2); }}