设计模式之单例模式

    xiaoxiao2021-03-25  99

    设计模式之单例模式

                   通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类的自身负责保存他的唯一实例。这个类可以保证没有其他实例可以被创建,并且塔可以提供一个访问该实例的方法 ! 单例模式如图  Singleton类,定义一个GetInstance方法,允许客户访问它的唯一实例,GetInstance是一个静态方法,主要负责创建自己的唯一实例; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 单例模式 { class Singleton { private static Singleton _instance; private Singleton() { } public static Singleton GetInstance() { if(_instance==null) { _instance = new Singleton(); } return _instance; } } class Program { static void Main(string[] args) { Singleton s1 = Singleton.GetInstance(); Singleton s2 = Singleton.GetInstance(); if(s1==s2) { Console.WriteLine("s1=s2"); } Console.ReadKey(); } } 多线程时的单例模式:        在多线程程序中,多个线程同时,注意是同时访问Singleton类,同时调用GetInstance()方法,会可能造成同时创建多个实例的; 这时候需要给进程一把锁来处理; lock是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则让它一直等待(即被阻止),直到该对象被释放; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 单例模式 { class Singleton { private static Singleton _instance; private static readonly object syncObject = new object(); //程序运行时创建一个静态只读的进程辅助对象; //多线程时的单例 public static Singleton GetInstanceOfThread() { //lock时确保当一个线程位于代码的临界区时,另一个线程不进入临界区; //如果其他线程试图进入锁定的代码,则将他一直等待(即被阻止),直到该对象被释放; //在同一个时刻加了锁的这部分程序只有一个线程可以进入; lock (syncObject) { if(_instance==null) { _instance = new Singleton(); } } return _instance; } } }
    转载请注明原文地址: https://ju.6miu.com/read-21103.html

    最新回复(0)