博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例模式泛型类
阅读量:6070 次
发布时间:2019-06-20

本文共 2320 字,大约阅读时间需要 7 分钟。

hot3.png

最理想的非泛型实现:

///     /// 单例模式的实现    ///     public class Singleton    {        // 定义一个静态变量来保存类的实例        private static Singleton uniqueInstance;        // 定义一个标识确保线程同步        private static readonly object locker = new object();        // 定义私有构造函数,使外界不能创建该类实例        private Singleton()        {        }        ///         /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点        ///         /// 
public static Singleton GetInstance() { // 当第一个线程运行到这里时,此时会对locker对象 "加锁", // 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁 // lock语句运行完之后(即线程运行完之后)会对该对象"解锁" if(uniqueInstance ==null){ //双层if将性能开销降到最低 lock (locker) { // 如果类的实例不存在则创建,否则直接返回 if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } }
///     /// 单例模式泛型类    ///     /// 
public abstract class Singleton
where T : class { private static T _Instance; private static readonly object Locker = new object(); public static T GetInstance() { if (_Instance == null) { lock (Locker) { if (_Instance == null) { _Instance = (T) Activator.CreateInstance(typeof(T), true); } } } return _Instance; } }

调用:

public class MySingleton : Singleton
{ public void IncrementCounter() { Console.WriteLine(11111111111111); } }static void Main(string[] args) { for (int j = 0; j < 1000; ++j) MySingleton.GetInstance().IncrementCounter(); Console.ReadLine(); }

以上泛型可以是where T:new() , 但是实现类必须得是共有的构造函数

当然也可以用lazy

public abstract class Singleton
where T : class { private static Lazy
_instance = new Lazy
(() => (T)Activator.CreateInstance(typeof(T), true)); public static T Instance { get { return _instance.Value; } } }

转载于:https://my.oschina.net/objectboy/blog/786868

你可能感兴趣的文章
阿里云企业邮(免费版)
查看>>
Centos7更换Yum源
查看>>
寻找总和为n的连续子数列之算法分析
查看>>
「镁客·请讲」钢铁侠张锐:外形仿人只是次要,拥有会自主决策的“运动脑”才是真的机器人...
查看>>
CentOS 6.5 apache源码安装2.0版
查看>>
Linux下快速静态编译Qt以及Qt动态/静态版本共存
查看>>
oracle11g学习笔记
查看>>
redhat 7.2更新yum源时踩的坑
查看>>
shell/bash 交集、并集、差集
查看>>
制造企业不要低估机器视觉社区数据的重要性
查看>>
Datastore Mount/Unmount Detach/Attach functions
查看>>
win2008 下实现exchange2007 ccr群集
查看>>
网络中个体的力量
查看>>
php读取文本去除空格
查看>>
数据结构简单介绍
查看>>
Python-函数
查看>>
11.python并发入门(part13 了解事件驱动模型))
查看>>
每天学一点Scala之type
查看>>
Android消息循环机制
查看>>
Esxi CPU/Memory Ratio
查看>>