java单例模式
常用5种单例模式
一.懒汉式 也称为饱汉式
1.调用getInstance才会被初始化
2.非线程安全
public class Singleton { /** * 自我实例化 */ private static Singleton singleton; /** * 构造方法私有 */ private Singleton() { System.out.println("创建单例实例..."); } /** * 对外提供获取实例的静态方法 */ public static Singleton getInstance() { if (null == singleton) { singleton = new Singleton(); } return singleton; }}
饿汉式
提前创建好实例对象,调用效率高,但无法延时加载,容易产生垃圾,线程安全。
public class Singleton { /** * 自我实例化 */ private static Singleton singleton = new Singleton(); /** * 构造方法私有 */ private Singleton() { System.out.println("创建单例实例..."); } /** * 对外提供获取实例的静态方法 */ public static Singleton getInstance() { return singleton; }}
双重检查锁模式
线程安全
public class Singleton { /** * 自我实例化,volatile修饰,保证线程间可见 */ private volatile static Singleton singleton; /** * 构造方法私有 */ private Singleton() { System.out.println("创建单例实例..."); } /** * 对外提供获取实例的静态方法 */ public static Singleton getInstance() { // 第一次检查,避免不必要的实例 if (singleton == null) { // 第二次检查,同步,避免产生多线程的问题 synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; }}
静态内部类模式
这样写充分利用静态内部类的特点——初始化操作和外部类是分开的,只有首次调用getInstance()方法时,虚拟机才加载内部类(SingletonInner.class)并初始化instance, 保证对象的唯一性。
public class Singleton { /** * 构造方法私有 */ private Singleton() { System.out.println("创建单例实例..."); } private static class SingletonInner { private static Singleton instance = new Singleton(); } private static Singleton getInstance() { return SingletonInner.singleton; }}
枚举单例模式
异常简单,默认枚举类创建的对象都是单例的,且支持多线程。
public enum Singleton { INSTANCE }