马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

单例模式

  [复制链接]
查看4174 | 回复6 | 2018-9-28 17:15:44 | 显示全部楼层 |阅读模式
本帖最后由 剑弑 于 2021-11-5 16:56 编辑

[C#] 纯文本查看 复制代码
public class SingLeton

{

     private static SinglLeton singleton=null; 

      private SingLeton()

     {

     }

    public static SingLeton getsingleton()

   { 

        if(singleton==null)

       {

           singleton=new  SingLeton();

       }

       return singleton;

   }

}

上面的代码就是一个单例模式的类,在使用单例模式时需要注意以下几点:
1.单例模式(Singleton)的构造函数必须是私有的(private),以保证程序中不能使用new()来实例,达到整个程序中只有唯一一个实例的目的;
2.必须提供一个静态的全局函数访问点,以确保外部能访问该实例;
     上面的单例模式(Singleton)中,在只有单线程去执行时是正确的,但如果在使用多线程时就会出现有多个实例,显然违背了单例模式(Singleton)的条件;哪么在多线程中我们应该怎样去实现单例模式(Singleton)呢???
     下面我们就来看看多线程中单例模式(Singleton)的实现:
      在多线程中不能使用上面代码中的单例模式(Singleton)的原因是因为它违反了整个程序中只有唯一一个实例的条件,所以我们要想在多线程中使用单例模式(Singleton)就必须实现只有唯一一个实例这一条件;在多线程中因为每条线程都是独立访问的,所以才会出多个实例;哪么只要我们在if条件前加上锁(lock)就能避免出现多个实例;下面我们来看看代码的实现:
[C#] 纯文本查看 复制代码
public class SingLeton

{

     private static SinglLeton singleton=null; 

     private static readonly object lockS=new object();//确保线程同步

      private SingLeton()

     {

     }

    public static SingLeton getsingleton()

   { 

        lock(lockS)

       {

           if(singleton==null)

           {

               singleton=new  SingLeton();

           }

      }

       return singleton;

   }

}

    以上的代码就是单例模式(Singleton)在多线程中的实现;
    在上面的多线程中的单例模式中是否是最好的呢?是不是使用最少资源呢?还能不能优化类呢?
下面我们就先来分析多线程中单例模式(Singleton)的运行:
    当程序的线程跑到锁(lock)的时候就会停下来判断是否有线程在用锁(lock)里面的代码,没有就才会进入,哪么如果多条线程跑到锁(lock)的时候就只能一条一条进入锁(lock)(当然这本来就是多线程锁(lock)的功能);进入锁里面判断到已有实例就跳出if不进行实例化。
上面我们对多线程中的单例模式(Singleton)做了分析;在上面的分析中我们可以看出,每条线程都要先进入锁(lock)才做了判断;但在没进入锁之前线程就知道已经可以判断出是否有过实例,哪为什么我们不在外面进行判断一次后在进入锁(lock)呢?好!既然这样我们把代码改改看看效果,我们在锁(lock)的外面加多一次判断
[C#] 纯文本查看 复制代码
public class SingLeton

{

     private static SinglLeton singleton=null; 

     private static raedonly object lockS=new object();//确保线程同步

      private SingLeton()

     {

     }

    public static SingLeton getsingleton()

   { 

     if(singleton==null)

        lock(lockS)

       {

           if(singleton==null)

           {

               singleton=new  SingLeton();

           }

      }

    }

       return singleton;

   }

}

从更改后的代码上看来,有人会问为什么要用两次if呢?有必要吗?外面不都判断过了吗?可以去掉一个if条件判断啊,这样代码不是更加少吗?
下面我就来解释下为什么要用到两次if。
其实用两个if的原因还是在于多线程的特性,还是因为多线程访问函数时都是独立访问的,所以才要用到两个if(说到这里大家都应该明白了,所以就不说下去了(不明白的可以在去了解多线程的物性))。

ibcadmin | 2018-9-28 21:38:38 | 显示全部楼层
+1+1+1
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
Hartmann | 2018-12-21 08:58:36 | 显示全部楼层
楼主,是否为空判断中这句:SingLeton singleton=new  SingLeton(); 应该为singleton=new  SingLeton();吧,不然外面定义的那个全局变量就没用了
剑弑 | 2018-12-28 17:38:42 | 显示全部楼层
Hartmann 发表于 2018-12-21 08:58
楼主,是否为空判断中这句:SingLeton singleton=new  SingLeton(); 应该为singleton=new  SingLeton();吧 ...

是的是的,是我大意了
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则