单例模式经典写法:懒汉式,饿汉模式,双重校验锁,静态内部类,枚举等。
懒汉模式
实例在需要用到的时候,才去创建,就比较懒。如果有则返回,没有则新建,需要加下 synchronized
关键字,要不然可能存在线性安全问题。
1 |
|
饿汉模式
饿汉模式,它比较饥饿、比较勤奋,实例在初始化的时候就已经建好了,不管你后面有没有用到,都先新建好实例再说。这个就没有线程安全的问题,但是呢,浪费内存空间呀。
1 | public class EHanSingleton { |
双重校验锁
双重校验锁实现的单例模式,综合了懒汉式和饿汉式两者的优缺点。以上代码例子中,在 synchronized 关键字内外都加了一层 if
条件判断,这样既保证了线程安全,又比直接上锁提高了执行效率,还节省了内存空间。
1 | public class DoubleCheckSingleton { |
静态内部类
静态内部类的实现方式,效果有点类似双重校验锁。但这种方式只适用于静态域场景,双重校验锁方式可在实例域需要延迟初始化时使用。
1 | public class InnerClassSingleton { |
枚举
枚举实现的单例,代码简洁清晰。并且它还自动支持序列化机制,绝对防止多次实例化。
1 | public enum SingletonEnum { |