【设计模式】——单例模式(其他类型)
2020-06-15 本文已影响0人
从不打小怪兽
双重检测锁式
- 这个模式将同步内容下方到if内部,提高了执行效率,不必每次获取对象都要进行同步,只有第一次才同步,创建了以后就没必要了。
/**
* 双重检查锁
* @author admin
*
*/
public class SingletonPattern03 {
private static SingletonPattern03 st3=null;
private SingletonPattern03() {
}
public static SingletonPattern03 getInstance() {
if(st3==null) {
SingletonPattern03 sp;
synchronized (SingletonPattern03.class) {
sp=st3;
if(sp==null) {
synchronized (SingletonPattern03.class){
if(sp==null) {
sp=new SingletonPattern03();
}
}
st3=sp;
}
}
}
return st3;
}
}
问题:由于编译器优化原因和JVM底层内部模型原因,偶尔会出问题,不建议使用--->看这个其他类的说明
静态内部类(也是一种懒加载的方式)
- 要点
- 外部类没有static属性,则不会像饿汉式那样立即加载对象。
- 加载类时是线程安全的。static final类型,保证内存只有一个实例存在,而且只能被赋值一次。
- 兼备了并发高效调用和延时加载的优势!
/**
* 静态内部内
* @author admin
*
*/
public class SingletonPattern04 {
//加载类时不会加载,真正调用的时候再加载。
private static class SingletonInstacne{
private static final SingletonPattern04 st4=new SingletonPattern04();
}
private SingletonPattern04(){
}
public static SingletonPattern04 getInstance(){
return SingletonInstacne.st4;
}
}
此时我没有啥想说的
枚举实现单例模式
- 优点:
- 实现简单
- 枚举本身就是单例模式。由JVM从根本上提供保障!避免通过反射和反序列化的漏洞!
/**
* 枚举式(没有延时加载)
* @author admin
*
*/
public enum SingletonPattern05 {
INSTANCE;
//可以添加需要的操作
public void singletonOperation(){
}
}
缺点:无延时加载