程序员: 我终于知道什么是单例模式

电脑杂谈  发布时间:2020-07-17 11:17:20  来源:网络整理

单例模式 singleton_单例模式 php_单例模式 c++

嗨,亲爱的先生们,钱Ju,我要回去更新大家,如果有人关注我的发展,我应该知道我在一年前发出了一个标志,我想在新年假期. 完成后,结果已经在三月份. 我还没有完成写作,看来我确实是一位合格的鸽子[手动狗头]

如今,我一直在思考如何编写这些设计模式单例模式 singleton,因为互联网上关于设计模式的轮子过多,我们一直在倡导使用轮子,不要重复创建轮子,尽管有很多设计模式教程,但是钱Ju认为互联网上写的那些东西太麻烦了,因此他考虑重新创建轮子.

Singleton模式,属于创建类型的常见软件设计模式. 通过单例模式方法创建的类在当前进程中只有一个实例(根据需要,线程也可能属于单例,例如: 程上下文中仅使用同一实例)

成千上万的Jue对单例模式的理解是,通过单例模式创建的类在应用程序中一次只能有一个实例

我们什么时候使用单例模式(例如应用程序中的配置文件类),如果您有多个实例,则整个应用程序中一次只能有一个实例,如果需要的话,在更改配置类时,很容易例外. (不要问钱据鹅为什么他知道,它是如此伤心地说了吧)

单例模式 php_单例模式 singleton_单例模式 c++

下面,我们将探讨制作单例的几种方法.

public class Singleton {
   //创建一个静态实例
    private static Singleton singleton;
   //限制随意创建单例模式
    private Singleton(){}
    //给出一个公共的静态方法返回一个单例
    public static Singleton getInstance(){
      //只有实例为空的时候才创建实例
        if(singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

在并发的情况下,上述写入方法不考虑标准单例模式. 一旦放置在具有并发请求的程序中,上述程序将具有多个实例,这不是单例模式.

给你一个并发的例子进行测试,以防止你们中的某些人问钱爵,为什么并发请求中它不是单例模式,钱Qian是你对我们说谎. 前爵是个不会撒谎的好人[狗头]

为什么要在并发时立即创建多个实例,因为在并发访问期间一个线程在创建实例之前会先引入另一个线程. 此时,尚未创建该实例,并再次对其进行判断. 此时,由于尚未创建前一个线程,因此该线程还会创建一个实例,因此导致多个实例将以这种单例模式出现的原因.

单例模式 singleton_单例模式 php_单例模式 c++

为了解决这种情况,我们认为最简单的形式应为以下形式.

public class SynchroizedSingleton {
    private static SynchroizedSingleton singleton;
    private SynchroizedSingleton(){}
    public synchronized static SynchroizedSingleton getInstance(){
        if(singleton == null){
            singleton = new SynchroizedSingleton();
        }
        return singleton;
    }
}

上面的代码可以在并发应用程序中使用,但是这种效率太慢了. 当一个线程访问此方法时,所有其他线程都处于等待状态.

我们可以优化上面的类. 只要尚未创建单例实例,在创建实例之后,就无需同步获取实例的方法,因此可以将以上代码优化为以下外观.

public class SynchroizedSingleton {
    private volatile static SynchroizedSingleton singleton;
    private SynchroizedSingleton(){}
    public static SynchroizedSingleton getInstance(){
        if(singleton == null){
            synchronized(SynchroizedSingleton.class){
              if(singleton == null){
                singleton = new SynchroizedSingleton();
              }
            }
        }
        return singleton;
    }
}

单例模式 singleton_单例模式 php_单例模式 c++

上面的代码是许多书籍中的标准双锁. 为什么需要判断同步块中的实例是否为空单例模式 singleton,因为如果创建了一个线程且该实例已准备好返回,那么这次是另一个线程进来,如果在同步块中没有判断,则有多个实例将被创建,为什么要添加volatile?因为创建好实例后应立即将此实例写入主存储器. 如果您不编写它,那么同步块中的判断也会失去效果.

如果您不知道volatile关键字的含义,可以给我留言. 如果人数很多,我将写一篇介绍volatile的文章. 记得跟着我.

饥饿的单身人士

public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return singleton;
    }
}

上面的代码是最简单的单例模式,但是Qian Jue不建议您使用此方法. 这种方法的缺点是,如果我曾经使用此类的静态方法,但是我们不打算使用此示例,则会浪费内存.

单例模式 c++_单例模式 singleton_单例模式 php

另一种方法是使用内部类

public class Singleton {
    private Singleton(){}
    public static Singleton getInstance(){
        return SingletonInstance.singleton;
    }
    private static class SingletonInstance{
        static Singleton singleton = new Singleton();
    }
}

上面是使用静态内部类作为单例,为什么上面的单例也是可能的,因为静态变量仅初始化一次,所以单例仍然是单例.

以上是编写单例模式的基本方法. 如果有遗漏,请在下面添加. 钱Ju首先感谢我.

这次引入的单例模式可能存在一些问题. 麻烦不要喷洒千壶. 毕竟,前觉是Java学习道路上的新手.

感谢您的观看.

在下一期中,我们将在设计模式下介绍工厂模式. 如果您有兴趣,请给我们一个大拇指和关注. 也欢迎您来微信找我. 微信搜索jue.


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-283488-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 张强强
        张强强

        最后面的那个手势和表情

      热点图片
      拼命载入中...