单例模式学习

”通常情况下我们可以让一个全局变量使得一个对象被访问,但不能防止你实例化多个对象,一个最好的方法就是,让类自身负责保存他的唯一实例。这个类可以保证没有其他实例可以被创建,并且他可以提供一个访问该实例的方法。“

一、经典单例

public class Singleton
{
        private static Singleton instance;

        private Singleton()
        {
        
        }

        public static Singleton GetInstance()
        {
                if(instance==null)
                {
                        instance=new Singleton();
                }
                return instance;
        }
}
Singleton类,定义一个GetInstance()操作,允许客户访问他的唯一实例。

说明:1.构造方法为private这样就保证了外界通过new来创建这个类的实例的可能;

   2.因为静态变量的生命周期和整个应用程序的生命周期是一样的,故定义一个private的静态变量来存储唯一实例。

二、多线程下的单例

多线程同时访问Singletion类调用GetInstance()操作时候会可能创建多个实例,对待这种情况我们需要加锁处理

public class Singleton
{
       private static Singleton instance;
       private static readonly object syncRoot=new object();

       private Singleton()
       {

       }

       public static Singleton GetInstance()
       {
               if(instance==null)
               {
                      lock(syncRoot)
                      {
                             if(instance==null)
                             {
                                     instance=new Singleton();
                             }
                      }
               }
               return instance;
       }
}

说明:1.外层if()保证只有在实例未被创建的时候在加锁处理;

   2.内层if()确保实例不被重复创建

三、静态初始化单例(饿汉模式)

public sealed class Singleton
{
        private static readonly Singleton instance=new Singleton();
 
        private Singleton(){}

        public static Singleton GetInstance()
        {
               return instance;
        }
}
说明 1.sealed 阻止其他类继承Singleton防止增加实例

2.readonly修饰instance 意味着类一加载就实例化对象,这样就由公共语言运行库负责变量初始化,我们无须考虑安全问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值