美文网首页程序员unity3D技术分享Unity基础入门分享
Unity3d游戏开发之-单例设计模式-多线程一

Unity3d游戏开发之-单例设计模式-多线程一

作者: 好怕怕 | 来源:发表于2016-05-31 14:30 被阅读255次

    单例模式3:
    多线程一

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 单例设计模式写法
    {
        /// <summary>
        /// 单例模式二:多线程一
        /// </summary>
        public class Singleton                                            //1:定义一个public的类
        {
            private static Singleton instance;                            //2:定义一个私有的静态变量来保持类的实例
            private static readonly object locker = new object();        //3:定义一个标示确保线程同步
            private Singleton() { }                                       //4:定义一个私有的静态构造函数,使外界不能访问
            public static Singleton Instance()                            //5:定义一个public静态的方法,提供一个全局访问点,同时也可以定义共有属性来提供全局访问点
            {
                //6:当第一个程序运行到这里时,此时会对locker对象“加锁”
                // ·当第二个线程运行该方法时,首先检测locker对象为“加锁”状态,该线程就会挂起等待第一个线程“解锁”
                // ·lock语句运行完之后(即线程运行完之后)会对该对象“解锁”
                lock (locker)
                {
                    if (instance == null)                                //7:判断类的实例是否存在,或者为空
                    {
                        instance = new Singleton();                       //8:如果类的实例不存在则创建一个
                    }
                }
                return instance;                                         //9:如果类的实例存在,直接返回
            }
    
            /*【多线程 说明:】
            上面这种解决方案确实可以解决多线程的问题,
            但是上面代码对于每个线程都会对线程辅助对象locker加锁之后再判断实例是否存在,
            对于这个操作完全没有必要的,因为当第一个线程创建了该类的实例之后,
            后面的线程此时只需要直接判断(uniqueInstance==null)为假,
            此时完全没必要对线程辅助对象加锁之后再去判断,所以上面的实现方式增加了额外的开销,
            损失了性能,为了改进上面实现方式的缺陷,
            我们只需要在lock语句前面加一句(uniqueInstance==null)的判断就可以避免锁所增加的额外开销,
            这种实现方式我们就叫它 “双重锁定”,请看后面我的分享。
            */
        }
    }
    

    相关文章

      网友评论

        本文标题:Unity3d游戏开发之-单例设计模式-多线程一

        本文链接:https://www.haomeiwen.com/subject/utwcdttx.html