1. 单例模式

  • 单例模式存在的意义

1. 一个class只有一个对象,减少了内存开支
2. 避免对资源多重占用

  • 适用于单例模式的场景

1. 频繁创建及销毁的对象,例如工具类
2. 不变的对象
3. 重量级对象,例如JDBC连接,httpClient等
  • 单例模式的使用

1. 饿汉式

/**
  * 恶汉式
  * 优点:类加载时就完成了实例化,避免了线程同步问题。
  * 缺点:static一直强引用这对象,直至类被销毁对象才会被销毁。可能造成内存浪费
  */
public class Singleton {

    private final static Singleton INSTANCE = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return INSTANCE;
    }
}

2. 饿汉式(双重检查)

/**
  * 懒汉式(双重检查)
  * 优点:线程安全,延迟加载,效率较高
  */
public class Singleton {

    private static volatile Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

3. 懒汉式

/**
  * 静态内部类
  * 原理:采用类加载的机制保证实例化的线程安全。当需要对象时,调用 getInstance 方法时才会加载 SingletonInstnce 类,完成实例化。
  * 优点:线程安全,延迟加载
  */
public class Singleton {

    private Singleton() {}

    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

4. 枚举

/**
  * 枚举
  * 原理:借用枚举来实现单例,不仅能避免线程问题,还能防止反序列化重新创建新的对象。
  */
public enum Singleton {
    INSTANCE;
    public void whateverMethod() {

    }
}

 

posted @ 2019-07-15 13:08  莹狼  阅读(149)  评论(0编辑  收藏  举报