单例模式

作者:碳水怪兽👾 发布于:2021/10/6

前言

单例模式属于创建型设计模式,保证一个类只有一个实例,单例模式可以实现延迟加载(在使用时才去创建实例),同时由于只有一个实例,单例模式可以节省资源(内存),甚至可以减轻GC的压力,不过单例模式也可能带来线程安全的问题。

正文

单例模式的几种实现方式

  • 饿汉式单例
  • 懒汉式单例
  • 双重检查单例
  • 枚举单例
  • 静态内部类单例
  • ThreadLocal单例

饿汉式单例

public class HungrySingleton {

    private static final HungrySingleton instance = new HungrySingleton();

    public static HungrySingleton getInstance(){
        return instance;
    }

}

懒汉式单例

懒汉式单例会有线程安全的问题

public class LazySingleton {

    private static LazySingleton instance;

    public static LazySingleton getInstance(){
        if(instance == null){
            instance = new LazySingleton();
        }
        return instance;
    }

}

双重检查单例

public class DoubleCheckSingleton {

    private static volatile DoubleCheckSingleton instance;

    public static DoubleCheckSingleton getInstance() {
        if (instance == null) {
            synchronized (DoubleCheckSingleton.class) {
                if (instance == null) {
                    instance = new DoubleCheckSingleton();
                }
            }
        }
        return instance;
    }
}

枚举单例

public enum EnumSingleton {
    INSTANCE;

    private Object obj;

    public static EnumSingleton getInstance(){
        return INSTANCE;
    }
}

静态内部类单例

public class StaticInnerClassSingleton {

    private static class Holder{
        private static final StaticInnerClassSingleton instance = new StaticInnerClassSingleton();
    }

    public static StaticInnerClassSingleton getInstance(){
        return Holder.instance;
    }
}

ThreadLocal单例

这种单例不是进程中唯一,而是线程中唯一

public class ThreadLocalSingleton {

    private static final ThreadLocal<ThreadLocalSingleton> theadLocal = new ThreadLocal<ThreadLocalSingleton>(){
        @Override
        protected ThreadLocalSingleton initialValue() {
            return new ThreadLocalSingleton();
        }
    };

    public static ThreadLocalSingleton getInstance(){
        return theadLocal.get();
    }
}

结尾

单例模式的应用

单例模式在线程池、缓存、Spring的Bean容器都有应用