饿汉模式:(常用) image.png

优点:线程安全,在类加载时就被创建,避免了多线程同步的问题。
缺点:不论加不加载都会创建一个实例,会占用内存,造成一个浪费。
适用场合:适合单例占用内存较小,在初始化就会被用到的情况。单例占用的内存较大或单例只在特定场景才会用到时,就不适合用了。

懒汉模式: image.png

优点:需要时才会去创建,再次调用也不会去创建新的对象而是返回之前创建的对象
缺点:当多线程并发调用该方法的时候,会创建多个实例。因此线程时不安全的

使用synchronized关键字同步模式: image.png

优点:解决的线程并发问题,也实现的延迟加载
缺点:synchronized关键字修饰的同步方法比一般方法慢的多,多次调用会导致性能损耗较大

双重校验锁模式: 1. 未禁止指令重排序优化模式: image.png

优点:解决了synchronized关键字性能损耗大的问题
缺点:由于指令重排优化的存在,导致初始化Singleton和将对象地址赋给instance字段的顺序是不确定的。在某个线程创建单例对象时,在构造方法被调用之前,就为该对象分配了内存空间并将对象的字段设置为默认值。此时就可以将分配的内存地址赋值给instance字段了,然而该对象可能还没有初始化。若紧接着另外一个线程来调用getInstance,取到的就是状态不正确的对象,程序就会出错。
  1. 禁止指令重排序优化模式:(常用) image.png

    优点:解决了上述指令重排序优化的问题,保证了 instance变量被赋值的时候对象已经是初始化过的。

静态内部类模式:(常用) image.png

优点:应用不用内部类,jvm就不会去加载这个单例类,从而不去创建单例对象,实现对懒汉模式的延迟加载。达到保证延迟加载和线程安全。