前言


懒汉饿汉

1、饿汉模式

public final class Singleton {
    // 创建好实例
    private static Singleton instance = new Singleton();
    // 构造函数
    private Singleton() {}
    // 获取实例
    public static Singleton getInstance() {
        return instance;
    }
}

2、懒汉模式

public final class Singleton {
    private static Singleton instance = null;
    // 构造函数
    private Singleton() {}
    // 获取实例
    public static Singleton getInstance() {
        // 为null时才实例化对象
        if (null == instance) {
            instance = new Singleton();
        }
        return instance;
    }
}

同步锁

public final class Singleton {
    private static Singleton instance = null;
    // 构造函数
    private Singleton() {}
    // 获取实例
    public static Singleton getInstance() {
        // 获取对象时加上同步锁
        if (null == instance) {
            synchronized (Singleton.class) {
                instance = new Singleton();
            }
        }
        return instance;
    }
}

双重检查锁

public final class Singleton {
    private static Singleton instance = null;
    // 构造函数
    private Singleton() {}
    // 获取实例
    public static Singleton getInstance() {
        // 第一次判断,当instance为null时则实例化对象
        if(null == instance) {
            synchronized (Singleton.class) {
                // 第二次判断,放在同步锁中,当instance为null时则实例化对象
                if(null == instance) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

最优双重检查锁

public final class Singleton {
    // 加上volatile关键字
    private volatile static Singleton instance = null;
    // 构造函数
    private Singleton() {}
    // 获取实例
    public static Singleton getInstance() {
        // 第一次判断,当instance为null时则实例化对象
        if(null == instance) {
            synchronized (Singleton.class) {
                // 第二次判断,放在同步锁中,当instance为null时则实例化对象
                if(null == instance) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

枚举模式

public class Singleton {

   // 构造函数
   private Singleton() {
   }

   // 从枚举中获取实例
   public static Singleton getInstance() {
      return SingletonEnum.SINGLETON.getInstance();
   }

   // 定义枚举
   private enum SingletonEnum {
      SINGLETON;

      private Singleton instance;

      // JVM保证这个方法只调用一次
      SingletonEnum() {
         instance = new Singleton();
      }

      public Singleton getInstance() {
         return instance;
      }
   }
}

总结


心得



本人原创文章纯手打,觉得有一滴滴帮助的话就请点个推荐吧~

本人长期分享工作中的感悟、经验及实用案例,喜欢的话也可以关注一下哦~

09-05 15:54