java单例模式

常用5种单例模式

一.懒汉式 也称为饱汉式

1.调用getInstance才会被初始化

2.非线程安全

  1. public class Singleton {
  2. /**
  3. * 自我实例化
  4. */
  5. private static Singleton singleton;
  6. /**
  7. * 构造方法私有
  8. */
  9. private Singleton() {
  10. System.out.println("创建单例实例...");
  11. }
  12. /**
  13. * 对外提供获取实例的静态方法
  14. */
  15. public static Singleton getInstance() {
  16. if (null == singleton) {
  17. singleton = new Singleton();
  18. }
  19. return singleton;
  20. }
  21. }

饿汉式

提前创建好实例对象,调用效率高,但无法延时加载,容易产生垃圾,线程安全。

  1. public class Singleton {
  2. /**
  3. * 自我实例化
  4. */
  5. private static Singleton singleton = new Singleton();
  6. /**
  7. * 构造方法私有
  8. */
  9. private Singleton() {
  10. System.out.println("创建单例实例...");
  11. }
  12. /**
  13. * 对外提供获取实例的静态方法
  14. */
  15. public static Singleton getInstance() {
  16. return singleton;
  17. }
  18. }

双重检查锁模式

线程安全

  1. public class Singleton {
  2. /**
  3. * 自我实例化,volatile修饰,保证线程间可见
  4. */
  5. private volatile static Singleton singleton;
  6. /**
  7. * 构造方法私有
  8. */
  9. private Singleton() {
  10. System.out.println("创建单例实例...");
  11. }
  12. /**
  13. * 对外提供获取实例的静态方法
  14. */
  15. public static Singleton getInstance() {
  16. // 第一次检查,避免不必要的实例
  17. if (singleton == null) {
  18. // 第二次检查,同步,避免产生多线程的问题
  19. synchronized (Singleton.class) {
  20. if (singleton == null) {
  21. singleton = new Singleton();
  22. }
  23. }
  24. }
  25. return singleton;
  26. }
  27. }

静态内部类模式

这样写充分利用静态内部类的特点——初始化操作和外部类是分开的,只有首次调用getInstance()方法时,虚拟机才加载内部类(SingletonInner.class)并初始化instance, 保证对象的唯一性。

  1. public class Singleton {
  2. /**
  3. * 构造方法私有
  4. */
  5. private Singleton() {
  6. System.out.println("创建单例实例...");
  7. }
  8. private static class SingletonInner {
  9. private static Singleton instance = new Singleton();
  10. }
  11. private static Singleton getInstance() {
  12. return SingletonInner.singleton;
  13. }
  14. }

枚举单例模式

异常简单,默认枚举类创建的对象都是单例的,且支持多线程。

  1. public enum Singleton {
  2. INSTANCE
  3. }