zoukankan      html  css  js  c++  java
  • U3D——单例模式的用法

    单例模式

    老生常谈的单例模式是那么的简单,但在框架设计中又是那么的重要,现在和大家一起讨论一下单例模式。

    特点:

       一、私有的构造函数(私有)

       二、私有静态的全局变量

       三、公有的静态对外接口

    作用:

           确保程序创建唯一变量

           避免频繁的创建销毁对象,提高性能

           避免对共享资源的多重占用,简化访问

           为整个系统提供一个全局访问点

    简单了解单例模式中的各种模式

    1、懒汉模式

    为什么叫懒汉模式呢,我觉得哈,因为这种类型是来一个new一个,所有感觉上比较懒(这纯属瞎逼逼,哈哈哈),上代码

    public class Singletion
    {
        private static Singletion instence;
        private Singletion() { }
        public static Singletion GetInstence()
        {
            if (instence ==null )
            {
                instence = new Singletion();
            }
            return instence;
        }
    }

    大家都在说懒汉模式下的多线程是不安全的单例模式,那为啥不安全呢,不安全在哪呢呢,下面给大家图解一下

     图解:现在有两个线程需要new同一个对象,当线程1运行到if(instence==null)后暂停,此时对象还未创建,线程2超过线程1直接new完对象后,此时If(instence==null)才生效,但此时线程1已经在if之中了,于是就会new两个相同的对象出来,综上所述,多线程下的懒汉式的单例模式是不安全的。

    安全的懒汉模式

    public class LockSingletion
    {
        private volatile static LockSingletion instance = null;
        private static readonly object _lock = new object();
        private LockSingletion() { }
        public static LockSingletion GetInstance()
        {
            if (instance ==null )
            {
                lock (_lock)
                {
                    if (instance ==null )
                    {
                        instance = new LockSingletion();
                    }
                }
            }
            return instance;
        }
    }

    为什么加个lock这个单例模式就安全了呢,现在我们来看一下Lock的定义

    定义:lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放

    2、饿汉模式

    public class HungrySingletion
    {
        private static HungrySingletion instance = new HungrySingletion();
        private HungrySingletion() { }
        public static HungrySingletion getInstence()
        {
            return instance;
        }
    }

    安全性:在类加载时会将进行加载,等到调用时该类已经被处理好了所以能保证多线程调用下,调用的是同一个实例。

    想知道安全性是怎么测试出来的,请点击

    在U3D中的用法

    单例模式在U3D中一般用做搭建管理类框架,如下图

    代码后期奉上

  • 相关阅读:
    qt鼠标事件总结(坐标,跟踪,点击判断)
    从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
    前端篇: 前端演进史
    找一款防文件或文件夹误删除,移动,修改的软件
    yyyy
    盘点我用过的那些网盘(那些年,我们一起玩的网盘)
    Win8/8.1/10获得完整管理员权限的方法
    [置顶] IT老男人读《因为痛,所以叫青春》
    dddd
    用JUNCTION映射文件夹内容 解决多系统跑同一个虚拟机而共享文件夹路径不同的问题
  • 原文地址:https://www.cnblogs.com/Baron-King/p/13404971.html
Copyright © 2011-2022 走看看