前言
单例模式是一种很常用的设计模式,其定义是单例对象的类只允许有一个实例存在。在使用spring自动创建对象时默认就是单例的。
使用场景
需要频繁的对对象进行创建与销毁,如果工具类对象
一、饿汉式(静态变量)
public class Singleton1 { private static final Singleton1 INSTANCE = new Singleton1(); //静态工厂 public static Singleton1 getInstance(){ return INSTANCE; } }
饿汉式就是在类加载初始化的时候就创建了对象,尽管你还不需要使用他。相对来说我是比较喜欢这种方式的,既没有线程安全,速度也快,当然这是以牺牲空间换取速度,大家可以根据实际情况,根据该对象被创建的概率酌情使用该方法。
二、饿汉式(静态代码块)
public class Singleton2 { private static Singleton2 instance = null; //静态代码块 static { instance = new Singleton2(); } public Singleton2 getInstance(){ return instance; } }
静态代码块实现的饿汉式与上述第一种方式类似,都是在类初始化的时候就创建对象,同样是线程安全的,其实就是JVM帮我们避免了线程安全,因为类只要加载一次,所以只会创建一个对象。
三、懒汉式(多线程下不可用)
public class Singleton3 { private static Singleton3 instance = null; public static Singleton3 getInstance(){ if (null == instance){ //(1) instance = new Singleton3(); //(2) } return instance; } }
这个懒汉式写法是线程不安全的,只能在单线程情况下使用。假设有两个线程A和B,线程A运行到(1)行代码时时间片已经完了,此时CPU切换执行线程B,线程B完成整个流程,也就是说这个时候instance已经不为空了,然后再执行线程A,此时线程A就会执行(2)行语句重新创建新的实例。
四、懒汉式(多线程下可用,但效率低)
public class Singleton4 { private static Singleton4 instance = null; public static synchr

