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

代码后期奉上

猜你喜欢

转载自www.cnblogs.com/Baron-King/p/13404971.html