zoukankan      html  css  js  c++  java
  • 设计模式——单例模式

    最近在学单例模式,一些想法和大家交流。

    为什么要有单例模式的?它在什么情况下使用的?从单例模式的定义中我们可以看出——单例模式的使用自然是当我们的系统中某个对象只需要一个实例的情况,例如:操作系统中只能有一个任务管理器,操作文件时,同一时间内只允许一个实例对其操作等,既然现实生活中有这样的应用场景,自然在软件设计领域必须有这样的解决方案了(因为软件设计也是现实生活中的抽象),所以也就有了单例模式了。

    说到单例模式,大家第一反应应该就是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有一个实例,所以单例模式也就是保证一个类只有一个实例的一种实现方法罢了,下面给出单例模式的一个官方定义:确保一个类只有一个实例,并提供一个全局访问点要保证一个类只有一个实例,可以在类里面创建自身的一个私有实例,并提供一个公共的方法来访问他,所以这个类的构造函数必须是私有的,不允许外界直接来创建实例。大家请看下面代码

    上面的实例在单线程的情况下是很好的,但是在多线程的情况下会出现一个问题,当两个线程同时运行到GetInstance方法时,此时两个线程判断(uniqueInstance ==null)这个条件时都返回真,此时两个线程就都会创建Singleton的实例,这样就违背了我们单例模式初衷了,既然上面的实现会运行多个线程执行,那我们对于多线程的解决方案自然就是使GetInstance方法在同一时间只运行一个线程运行就好了。可以参照下面一段代码,这是懒汉模式的单例设计

    这样当第一个线程运行到判断instance是否存在时如果不存在则会上锁,那么下一个线程将会挂起等待,很好的解决的多线程的问题。

    还有一种是饿汉模式的单例设计:

     internal class Person
        {
            public string name;
    
            private Person()
            {
            }
            static Person p=new Person();
    
            public static Person GetInstance()
            {
                return p;
            }
        }
    

      


        这是个人最近学习单例模式的一些体会,希望对大家有所帮助,水平有限欢迎大家多多指教。

        共同学习,共同进步。

  • 相关阅读:
    安装lnmp 时如何修改数据库数据存储地址及默认访问地址
    ubuntu 设置root用户密码并实现root用户登录
    解决ubuntu 远程连接问题
    linux 搭建FTP服务器
    PHP 根据ip获取对应的实际地址
    如何发布自己的composer包
    使用composer安装composer包报Your requirements could not be resolved to an installable set of packages
    laravel 框架配置404等异常页面
    使用Xshell登录linux服务器报WARNING! The remote SSH server rejected X11 forwarding request
    IoTSharp 已支持国产松果时序数据库PinusDB
  • 原文地址:https://www.cnblogs.com/lip0121/p/3334704.html
Copyright © 2011-2022 走看看