美文网首页
Java设计模式:单例模式-独一无二的对象

Java设计模式:单例模式-独一无二的对象

作者: Clannad_汐 | 来源:发表于2017-08-04 02:55 被阅读0次

概念:

  • 单例模式:
    单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
  • 用处:
    有一些对象我们只需要一个,例如:线程池(threadpool),缓存(cache),对话框,注册表(registry)。如果制造出多个实例,就会导致许多问题,例如:程序行为异常,资源使用过量或不一致。

实现:

  • 最基本的单例模式:
public class SingletonDemo01 {
    //使用静态变量来记录SingletonDemo01的唯一实例
    private static SingletonDemo01 singleton;
    //创建一个私有的构造器
    private SingletonDemo01() {
    }
    //获取单例对象的方法
    public static SingletonDemo01 getInstance(){
        //如果对象为空则创建
        if(singleton == null) {
            singleton = new SingletonDemo01();
        }
        //返回对象
        return singleton;
    }
}

  • 上面这个单例是线程不安全的,所以需要改进,一共有三种方法:
  • 方法一:加上同步实现线程安全:synchronized
public class SingletonDemo01 {
    //使用静态变量来记录SingletonDemo01的唯一实例
    private static SingletonDemo01 singleton;
    //创建一个私有的构造器
    private SingletonDemo01() {
    }
    //获取单例对象的方法  添加了同步锁
    public static synchronized SingletonDemo01 getInstance(){
        //如果对象为空则创建
        if(singleton == null) {
            singleton = new SingletonDemo01();
        }
        //返回对象
        return singleton;
    }
}
  • 方法二:在静态初始化器中构建单件,也叫饿汉式单例
public class SingletonDemo02 {
    //在静态初始化器中构建单件 保证了线程安全
    private static SingletonDemo02 singleton = new SingletonDemo02();
    //私有化构造器
    private SingletonDemo02() {};
    //返回该类的对象
    public static SingletonDemo02 getInstance() {
        return singleton;
    }
}


  • 方法三:双重检查加锁:利用双重检查加锁,首先检查是否实例已经创建,如果尚未创建,才进行同步,这样只会同步一次,大大提升效率
//双重检查加锁 实现单例
public class SingletonDemo03 {
    //volatile关键字确保singleton被初始化时,线程正确的处理singleton变量
    private volatile static SingletonDemo03 singleton;
    private SingletonDemo03(){}
    public static SingletonDemo03 getInstance() {
        //只同步第一次
        if(singleton == null) {
            synchronized (SingletonDemo03.class) {
                if(singleton == null) {
                    singleton = new SingletonDemo03();
                }
            }
        }
        return singleton;
    }
}

总结:

  1. 如果getInstance() 的性能对应用程序不是很关键,方法一更合适
  2. 如果程序总是在创建和使用单例,方法二更合适
  3. 如果想要提升性能,减少同步锁的使用,则方式三更合适

相关文章

  • 单例模式

    3、单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象...

  • 单例模式

    java设计模式-单例模式 @(JAVA设计模式) 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行...

  • 设计模式-单例模式(Singleton)

    单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保...

  • JAVA设计模式 - 单例模式

    JAVA设计模式 - 单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一...

  • 单例模式

    JAVA设计模式之单例模式 十种常用的设计模式 概念: java中单例模式是一种常见的设计模式,单例模式的写法...

  • Java中单例模式你用的哪一种?

    一起讨论java中的单例模式。单例模式是java设计模式中算是最简单的设计模式了。 * java实现单例模式的写法...

  • Kotlin-单例类

    1、单例模式:设计模式之一,可以避免创建重复的对象。 2、单例模式工作机制Java写法: public class...

  • 基础设计模式:单例模式+工厂模式+注册树模式

    基础设计模式:单例模式+工厂模式+注册树模式 单例模式: 通过提供自身共享实例的访问,单例设计模式用于限制特定对象...

  • JAVA设计模式之单例模式

    JAVA设计模式之单例模式

  • 设计模式

    Java 设计模式情景分析 ——单例模式 Java 设计模式情景分析——建造者模式 Java 设计模式情景分析——...

网友评论

      本文标题:Java设计模式:单例模式-独一无二的对象

      本文链接:https://www.haomeiwen.com/subject/ornmlxtx.html