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的构造方法,只有一个对象,需要返回单例对象,在反序列化不会重新创建新的对象
原文:https://www.cnblogs.com/doosn777/p/10902570.html