C#单例模式

 

public class SingLeton多线程

{函数

     private static SinglLeton singleton=null; 优化

      private SingLeton()线程

     {资源

     }get

    public static SingLeton getsingleton()同步

   { 博客

        if(singleton==null)class

       {object

           SingLeton singleton=new  SingLeton();

       }

       return singleton;

   }

}

上面的代码就是一个单例模式的类,在使用单例模式时须要注意如下几点:

1.单例模式(Singleton)的构造函数必须是私有的(private),以保证程序中不能使用new()来实例,达到整个程序中只有惟一一个实例的目的;

2.必须提供一个静态的全局函数访问点,以确保外部能访问该实例;

     上面的单例模式(Singleton)中,在只有单线程去执行时是正确的,但若是在使用多线程时就会出现有多个实例,显然违背了单例模式(Singleton)的条件;哪么在多线程中咱们应该怎样去实现单例模式(Singleton)呢???

     下面咱们就来看看多线程中单例模式(Singleton)的实现:

      在多线程中不能使用上面代码中的单例模式(Singleton)的缘由是由于它违反了整个程序中只有惟一一个实例的条件,因此咱们要想在多线程中使用单例模式(Singleton)就必须实现只有惟一一个实例这一条件;在多线程中由于每条线程都是独立访问的,因此才会出多个实例;哪么只要咱们在if条件前加上锁(lock)就能避免出现多个实例;下面咱们来看看代码的实现:

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 singleton=new  SingLeton();

           }

      }

       return singleton;

   }

}

    以上的代码就是单例模式(Singleton)在多线程中的实现;

    在上面的多线程中的单例模式中是不是最好的呢?是否是使用最少资源呢?还能不能优化类呢?

下面咱们就先来分析多线程中单例模式(Singleton)的运行:

    当程序的线程跑到锁(lock)的时候就会停下来判断是否有线程在用锁(lock)里面的代码,没有就才会进入,哪么若是多条线程跑到锁(lock)的时候就只能一条一条进入锁(lock)(固然这原本就是多线程锁(lock)的功能);进入锁里面判断到已有实例就跳出if不进行实例化。

上面咱们对多线程中的单例模式(Singleton)作了分析;在上面的分析中咱们能够看出,每条线程都要先进入锁(lock)才作了判断;但在没进入锁以前线程就知道已经能够判断出是否有过实例,哪为何咱们不在外面进行判断一次后在进入锁(lock)呢?好!既然这样咱们把代码改改看看效果,咱们在锁(lock)的外面加多一次判断

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 singleton=new  SingLeton();

           }

      }

    }

       return singleton;

   }

}

从更改后的代码上看来,有人会问为何要用两次if呢?有必要吗?外面不都判断过了吗?能够去掉一个if条件判断啊,这样代码不是更加少吗?

下面我就来解释下为何要用到两次if。

其实用两个if的缘由仍是在于多线程的特性,仍是由于多线程访问函数时都是独立访问的,因此才要用到两个if(说到这里你们都应该明白了,因此就不说下去了(不明白的能够在去了解多线程的物性))。

 

 

这是第一次写博客、文采也很差,有什么不对的写的很差的请你们见凉。。。。。。

相关文章
相关标签/搜索