Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
- 饿汉式,JVM在加载这个类时就马上创建此唯一的单例实例
- 懒汉式,单例实例在第一次被使用时构建,而不是在JVM在加载这个类时就马上创建此唯一的单例实例
- 饿汉式代码实例
public class Singleton { private static Singleton INSTANCE = new Singleton(); private Singleton() { } public static Singleton getINSTANCE() { return INSTANCE; }}复制代码
- 懒汉式代码
public class Singleton { private static Singleton INSTANCE; private Singleton() { } public static synchronized Singleton getINSTANCE() { if (INSTANCE == null) { INSTANCE = new Singleton(); } return INSTANCE; }}复制代码
- 懒汉式代码2(双重加锁版本)
public class Singleton { /** * volatile保证,当uniqueInstance变量被初始化成Singleton实例时, * 多个线程可以正确处理uniqueInstance变量 */ private static volatile Singleton INSTANCE; private Singleton() { } public static Singleton getINSTANCE() { //检查实例,如果不存在,就进入同步代码块 if (INSTANCE == null) { //只有第一次才彻底执行这里的代码 synchronized (Singleton.class) { //进入同步代码块后,再检查一次,如果仍是null,才创建实例 if (INSTANCE == null) { INSTANCE = new Singleton(); } } } return INSTANCE; }}复制代码
- 懒汉式代码3(静态内部类版本)
静态内部实现的单例是懒加载的且线程安全。 只有通过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,从而实例化 instance(只有第一次使用这个单例的实例的时候才加载,同时不会有线程安全问题)。
public class Singleton { //静态内部类 private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton() { } public static Singleton getINSTANCE() { return SingletonHolder.INSTANCE; }}复制代码
- 饿汉式代码2(枚举模式)
使用枚举实现单例更简洁,自动支持序列化机制,绝对防止多次实例化 (如果单例类实现了Serializable接口,默认情况下每次反序列化总会创建一个新的实例对象
public enum Singleton { INSTANCE; public void doSomething(){ //doSomething }}复制代码
枚举单例的使用
Singleton instance = Singleton.INSTANCE;instance.doSomething();复制代码