单例设计模式

1. 什么是单例设计模式

  • 单例类只能有一个实例
  • 单例类必须自己创建自己的唯一一个实例
  • 单例类必须给所有其他对象提供这一实例

2. 懒汉式单例

  • 特点:在第一次调用的时候实例化自己
public class Singleton{
  private Singleton(){}
  private static Singleton single = null;
//静态工厂方法
public static Singleton getInstance(){
  if (single == null){
     single = new Singleton();
  }
   return single;
}

2.1存在的问题

  • 通过反射机制是能够实例化构造方法为private的类的,那基本上所有使用java单例都会失效。
  • 没有考虑线程安全,下面是改造方式

2.2 决断线程安全问题

2.2.1 在getInstance方法上机上同步

public static synchronized Singleton getInstance(){
    if(single == null){
        single = new Singleton();
    }
    return single;
}

2.2.2 同步代码块

public static Singleton getInstance(){
    if(singleton == null){
        sychronized(Singleton.class){
            if(singleton == null)({
                singleton = new Singleton();
            }
        }
    }
    return singleton;
}

2.2.3 静态内部类

public class Singleton{
    private Singleton(){}
    private static class LazyHolder{
//final修饰的变量只能被赋值一次
        private static final Singleton INSTANCE = new Singleton();
    }
//final修饰的方法不能够被重写,但是可以被继承
    public static final Singleton getInstance(){
        return LazyHolder.INSTANCE;
    }
}
// final修饰的类不能被继承
  • 似乎这种方式比较优雅
    至于1、2、3这三种实现又有些区别,

第1种,在方法调用上加了同步,虽然线程安全了,但是每次都要同步,会影响性能,毕竟99%的情况下是不需要同步的,

第2种,在getInstance中做了两次null检查,确保了只有第一次调用单例的时候才会做同步,这样也是线程安全的,同时避免了每次都同步的性能损耗

第3种,利用了classloader的机制来保证初始化instance时只有一个线程,所以也是线程安全的,同时没有性能损耗,所以一般我倾向于使用这一种。
————————————————

2. 饿汉式单例(天生就是线程安全的)

  • 特点:饿汉式单例,在类初始化时,就已经自行实例化
public class Singleton1{
    private Singleton1(){}
    private static final Singleton1 single = new Singleton1();
    //静态工厂方法
    public static Singleton1 getInstance(){
         return single;
    }
}

参考:

原文链接:https://blog.csdn.net/jason0539/article/details/23297037

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 设计模式在软件开发人员中非常流行。设计模式是一种通用软件问题的精妙解决方案。单例模式是Java创建型设计模式中的一...
    唐先僧阅读 4,398评论 2 21
  • 单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属...
    Anwfly阅读 3,244评论 0 1
  • 什么是设计模式? 是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。一些开发的套路,用于解决某一些特...
    Spring618阅读 3,836评论 0 0
  • 所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在。 作用 避免对象的多次创建,节约资源 单例设计模...
    古都旧城阅读 4,247评论 0 0
  • 最近和朋友闲聊,听他说,孩子的班级里有很多家长,为了让孩子当班长,而暗地里给老师送礼。听到这里,我苦笑了一下,感叹...
    清溪清阅读 1,768评论 1 3