1,什么是单例模式 有时候我们只需要一个类的唯一对象,而不会创建更多的对象时候,就需要单例模式了。2,单例模式的好处 单例模式有很多好处,首先可以避免对象反复的创建,从而减少了内存空间的消耗,更重要的是如果在整个程序中 需要一个全局管理的对象,而且这个对象只有一个那么单例模式就是一个很好的选择了3,单例模式如何写 单例模式有很多种写法,我们来了解一下各自的区别//饿汉式/*从代码中我们看到,类的构造函数定义为private的,保证其他类不能实例化此类,然后提供了一个静态实例并返回给调用者。饿汉模式是最简单的一种实现方式,饿汉模式在类加载的时候就对实例进行创建,实例在整个程序周期都存在。它的好处是只在类加载的时候创建一次实例,不会存在多个线程创建多个实例的情况,避免了多线程同步的问题。它的缺点也很明显,即使这个单例没有用到也会被创建,而且在类加载之后就被创建,内存就被浪费了。*/public class Singleton{private static Singleton instance = new Singleton();private Singleton(){}public static Singleton newInstance(){return instance; } }//懒汉式/*懒汉模式中单例是在需要的时候才去创建的,如果单例已经创建,再次调用获取接口将不会重新创建新的对象,而是直接返回之前创建的对象。如果某个单例使用的次数少,并且创建单例消耗的资源较多,那么就需要实现单例的按需创建,这个时候使用懒汉模式就是一个不错的选择。*/public class Singleton{private static Singleton instance = null;private Singleton(){}public static Singleton newInstance(){if(null == instance){ instance = new Singleton(); }return instance; } }/*但是这里的懒汉模式并没有考虑线程安全问题,在多个线程可能会并发调用它的getInstance()方法,导致创建多个实例,因此需要加锁解决线程同步问题,实现如下。*/public class Singleton{private static Singleton instance = null;private Singleton(){}public static synchronized Singleton newInstance(){if(null == instance){ instance = new Singleton(); }return instance; } }//双重校验锁/*加锁的懒汉模式看起来即解决了线程并发问题,又实现了延迟加载,然而它存在着性能问题,依然不够完美。synchronized修饰的同步方法比一般方法要慢很多,如果多次调用getInstance(),累积的性能损耗就比较大了。因此就有了双重校验锁,先看下它的实现代码。*/public class Singleton {private static Singleton instance = null;private Singleton(){}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) { instance = new Singleton(); } } }return instance; } }4,总结 实际上单例的写法还有静态内部类,和枚举的写法,但是实际开发中很少有人这么去写 单例模式有多种方式,选择最合适的方式即可 在开发中常用的写法是双重校验锁的方式 单例模式适合全局只需要一个对象的场景