单例模式是一种创建型模式,保证一个类只有一个实例对象。
场景:打印机,一个系统可存在多个打印任务,但只能有一个正在工作的任务;
在Spring中创建的Bean实例默认都是单例模式存在的
懒汉式:在类加载时不初始化
1、懒汉式1,线程不安全
public class SingletonDemo1 { private static SingletonDemo1 instance; private SingletonDemo1(){} public static SingletonDemo1 getInstance(){ if (instance == null) { instance = new SingletonDemo1(); } return instance; } }
2、懒汉式2、线程安全、引入锁效率低
public class SingletonDemo2 { private static SingletonDemo2 instance; private SingletonDemo2(){} public static synchronized SingletonDemo2 getInstance(){ if (instance == null) { instance = new SingletonDemo2(); } return instance; } }
3、懒汉式、线程安全、效率高
public class SingletonDemo3 { private volatile static SingletonDemo3 singletonDemo3; private SingletonDemo3(){} public static SingletonDemo3 getSingletonDemo3(){ if (singletonDemo3 == null) { synchronized (SingletonDemo3.class) { if (singletonDemo3 == null) { singletonDemo3 = new SingletonDemo3(); } } } return singletonDemo3; } }
饿汉式:在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快。
4、饿汉式
public class SingletonDemo4 { private static SingletonDemo4 instance = new SingletonDemo4(); private SingletonDemo4(){} public static SingletonDemo4 getInstance(){ return instance; } }
5、静态内部类
public class SingletonDemo5 { private static class SingletonHolder{ private static final SingletonDemo5 instance = new SingletonDemo5(); } private SingletonDemo5(){} public static final SingletonDemo5 getInsatance(){ return SingletonHolder.instance; } }
在加载外部类的时候,并不会同时加载其静态内部类,只有在发生调用的时候才会进行加载,加载的时候就会创建单例实例并返回,有效实现了懒加载
类级内部类结合多线程默认同步锁,同时实现延迟加载和线程安全。
注:FelEngine创建对象比较耗时,选择使用懒汉式单例模式,避免重复创建对象提高效率。