设计单例设计模式按照创建的时间分为 饿(比较急迫使用)汉式、懒(比较懒需要的时候才创建)汉式
饿汉式常见的形式
- 直接实例化(比较简介直观)
- 枚举式(最简洁)
- 静态代码块饿汉式(适合复杂实例化)
懒汉式常见的形式
- 线程不安全(适用单线程)
- 线程安全(适用多线程)
- 静态内部类形式(适用多线程)
①饿汉式 直接实例化 示例代码
public class Singleton1 { public static final Singleton1 INSTANCE=new Singleton1(); private Singleton1(){ } }
②枚举类型
public enum Singleton2 { INSTANCE }
③静态代码块
public class Singleton3 { public static final Singleton3 INSTANCE; static { INSTANCE=new Singleton3(); } private Singleton3(){ } }
④懒汉式 线程不安全的形式(适用单线程程序)
public class Singleton4 { public static Singleton4 instance; private Singleton4(){ } public static Singleton4 getInstance(){ if (instance==null){ instance=new Singleton4(); } return instance; } }
上面④的方式在多线程可能会造成线程安全问题,多个线程可能都进入到if中然后,都执行new实例化,导致产生不止一个示例对象。解决方法是加锁,保证只有一个线程能进入if中进行new实例化
⑤线程安全
public class Singleton5 { public static Singleton5 instance; private Singleton5() { } public static Singleton5 getInstance() { if (instance == null) {//提高效率加的判断 synchronized (Singleton5.class) { if (instance == null) { instance = new Singleton5(); } } } return instance; } }
⑥静态内部类
静态内部类的特点
- 在内部类加载和初始化时才创建INSTANCE实例对象
- 静态内部类不会自动随着外部类加载和初始化,jdk会单独去加载和初始化
public class Singleton6 { private Singleton6(){ } private static class InnerClass{ private static final Singleton6 INSTANCE=new Singleton6(); } public static Singleton6 getInstance(){ return InnerClass.INSTANCE; } }