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中一般用做搭建管理类框架,如下图

    代码后期奉上

  • 相关阅读:
    HDU5343:MZL's Circle Zhou(SAM,记忆化搜索DP)
    动归皆背包——那些做过的背包
    CODEVS 3943 数学奇才琪露诺
    codevs 1540 银河英雄传说
    CODEVS 1004四子连棋
    洛谷1082 同余方程
    洛谷1006 传纸条
    洛谷1508 Likecloud-吃、吃、吃
    洛谷1108 低价购买
    洛谷1156 垃圾陷阱
  • 原文地址:https://www.cnblogs.com/Baron-King/p/13404971.html
Copyright © 2011-2022 走看看