单例模式常用的几种实现方式

1.懒汉模式

懒汉模式(可以理解为延迟加载)

public class Singleton{
    private static Singleton singleton;

    private Singleton() {
    }

    public synchronized static Single newInstance() { //加入synchronized关键字可以避免多线程的问题
     if (singleton== null) { singleton= new Singleton(); } return singleton; } }

2.饿汉模式

饿汉模式(贪婪加载)

public class Singleton {
    //在对象声明的时候直接初始化对象
    private static Singleton singleton= new Singleton();

    private singleton() {
    }

    public static Singleton newInstance() {
        return singleton;
    }
}

3.双重检查加锁

public class Singleton {
    //加入volatile关键字避免了多线程,又不会降低性能
    private volatile static Singleton singleton;

    private Singleton() {
    }

    public static Singleton newInstance() {
        if (singleton == null) {
            //使用同步块
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}    

4.枚举

public enum Singleton {
    //枚举是写法最简单的,默认枚举实例的创建时线程安全的,且在任何一种情况下它都是单例,包括反序列化
    INSTANCE;
}

5.静态内部类

 public class Singleton {
   
    private Singleton() {
    }

    public Singleton getInstance() {
        return SingletonHolder.SINGLETON;
    }

    private static class SingletonHolder {
        private static final Singleton SINGLETON = new Singleton();
    }
}

 当第一次加载Singleton类时并不会初始化SINGLRTON,只有第一次调用getInstance方法的时候才会初始化SINGLETON第一次调用getInstance 方法的时候虚拟机才会加载SingletonHoder类,这种方式不仅能够保证线程安全,也能够保证对象的唯一,还延迟了单例的实例化,所以推荐使用这种方式

总结:单例模式是为了保证系统中只有一个实例,主要注意它有private的构造方法,只有一个对象,需要返回单例对象,在反序列化不会重新创建新的对象

猜你喜欢

转载自www.cnblogs.com/doosn777/p/10902570.html