什么是单例模式?

SingletonPattern,确保这个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

优点

  1. 内存中只有一个实例,减少内存开支,减少系统性能的开销(如这个实例对象在生产时需要较多的资源时,如读取配置、禅城其他以来对象等)
  2. 可以避免对资源的多重占用(如一个写文件动作,一个实例对象这样避免一个资源文件的同时写操作)
  3. 在系统中设置全局访问点,优化和共享资源访问

缺点

  1. 单例一般没有接口,扩展困难。(我说的是一般)
  2. 对测试不利。(某种情况下我觉得也无所谓了)

使用场景

  • 要求生成唯一序列号的环境
  • 在整个项目中需要一个共享访问点或共享数据。如web页面的访问计数器等
  • 创建一个对象需要消耗的资源过多,如还需要访问IO或者数据库等
  • 需要定义大量的静态常量和静态方法的环境

注意事项

最主要的就是线程安全不安全的问题。

正确的写法

/**
 * Created by jls on 2018/2/26.
 *
 * 静态内部类
 * 我比较倾向于使用静态内部类的方法
 */
public class Singleton5 {
    //创建一个静态内部类
    private static class SingletonHolder{
        private  static final Singleton5 singleton= new Singleton5();
    }
    //私有的构造函数
    private  Singleton5(){}
    private  static  final Singleton5 getSingleton(){
        return  SingletonHolder.singleton;
    }
}
/**
 * Created by jls on 2018/2/26.
 * 双重检验锁模式
 *
 */
public class Singleton3 {
    //创建一个私有的对象 volatile确保 指令重排序优化
    private volatile static Singleton3 singleton;
    // 构造函数 私有的
    private Singleton3(){}

    //使用公共方法来获取对象 双重检验锁
    public static  Singleton3 getSingleton(){
        if(singleton==null){
            synchronized (Singleton3.class){
                if(singleton==null) {
                    singleton = new Singleton3();
                }
            }

        }
        return singleton;
    }
}

其他还有懒汉式、双重检验锁模式、饿汉式、静态内部类、枚举类型的方式
详细请看 https://github.com/woboke/helloworld/tree/master/src/main/java/com/edianedi/DesignPatterns/SingletonPattern