上次说了简单的单例设计模式,这次说其他的几个模式。
1.饿汉式(静态代码块)
这个模式是线程安全的,但是不具备懒加载功能,只要用到了就实例,不具备懒加载,比较消耗性能,所以不推荐。
2.懒汉式
这是常规的懒汉式写法,需要就加载,不用不加载,但是是线程不安全的。试想一下,两个线程若同时访问if代码,那么两个线程都会判为null,所以就会创建两个实例。
3.线程安全的懒汉式:
还是两条线程同时访问,但是由于synchronized关键字的作用,第二条线程会等待第一条线程执行完毕才会进入,虽然不会再创建线程了,但是这种方法效率低下。
4.双重检查模式(推荐)
看注释,不解释。两条判断缺一不可。
volatile关键字的作用:
首先说一下新建一个对象需要的三个步骤:
1.新建一个对象,但还未初始化。
2.调用构造函数初始化该对象.
3.把对象指向引用。
再双重检查模式里面,如果不加volatile关键字,很容易出现半成品的实例对象,执行的顺序可能就是132。加上volatile可以保证对象会完成初始化,不会被重排序。
5.静态内部类:
这种方式是推荐的,由于java的类加载机制,外部类被执行的时候,内部类是不会被加载的,只有调用静态方法的时候才会被加载,这样也实现了懒加载,对性能也很友好。
最后来说说单例模式的枚举类
枚举类有三个优点:
1.写法简介,就一句就搞定了。
2.线程安全,枚举是不允许反序列化。
3.防止反射,因为枚举类是不允许反射的。
更推荐大家使用枚举类
好的 我说完了。
那么我们有病再见!