单例模式
老生常谈的单例模式是那么的简单,但在框架设计中又是那么的重要,现在和大家一起讨论一下单例模式。
特点:
一、私有的构造函数(私有)
二、私有静态的全局变量
三、公有的静态对外接口
作用:
确保程序创建唯一变量
避免频繁的创建销毁对象,提高性能
避免对共享资源的多重占用,简化访问
为整个系统提供一个全局访问点
简单了解单例模式中的各种模式
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中一般用做搭建管理类框架,如下图
代码后期奉上