前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之单例模式

设计模式之单例模式

作者头像
bering
发布2019-12-03 15:39:23
3470
发布2019-12-03 15:39:23
举报
文章被收录于专栏:游戏开发之旅游戏开发之旅

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/CJB_King/article/details/61196167

设计模式之单例模式

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

单例模式如图

Singleton类,定义一个GetInstance方法,允许客户访问它的唯一实例,GetInstance是一个静态方法,主要负责创建自己的唯一实例;

代码语言:javascript
复制
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是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则让它一直等待(即被阻止),直到该对象被释放;

代码语言:javascript
复制
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;
        }
    }

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-03-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 设计模式之单例模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档