博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#单例测试(懒汉式双锁保证线程安全)
阅读量:7095 次
发布时间:2019-06-28

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

单例模式的概念

单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

关键点

  • 这个类只有一个实例,这是最基本的
  • 它必须自行创建这个实例,外部不能实例化
  • 进程内唯一

代码

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace WCF_Host_Service{    ///     /// 服务程序唯一上下文对象(单例)    ///     public sealed  class ServiceContext    {        private static ServiceContext _ServiceContext = null;        private readonly static object lockObj = new object();        ///         /// 禁止外部进行实例化        ///         private ServiceContext()        {        }        ///         /// 获取唯一实例,双锁定防止多线程并发时重复创建实例        ///         /// 
public static ServiceContext GetInstance() { if (_ServiceContext == null) { lock (lockObj) { if (_ServiceContext == null) { _ServiceContext = new ServiceContext(); } } } return _ServiceContext; } }}

关键点: 1)私有的构造函数 2)两次进行唯一实例的内部成员变量是否为空的判断。第二次判断时是在lock的前提下进行的。所以是唯一的,这次判断保证了是否为空的结论是线程安全的。

测试过程

ConcurrentDictionary
dict = new ConcurrentDictionary
(); Action testTask = () => { ServiceContext sc = ServiceContext.GetInstance(); if (sc != null && !dict.ContainsKey(sc.GetHashCode())) { dict.TryAdd(sc.GetHashCode(), sc); } Thread.Sleep(1); }; int index = 0; while (index < 1024) { Parallel.Invoke(testTask,testTask); index++; } Debugger.Log(0,"",string.Format("测试共生出{0}个实例。",dict.Count));

利用反射外部强制实例化测试:

var type = this.GetType().Assembly.GetType(typeof(ServiceContext).FullName);                    var sc = Activator.CreateInstance(type);

转载地址:http://dbaql.baihongyu.com/

你可能感兴趣的文章
关于数据存储类型的一点分析
查看>>
Java关键字
查看>>
SharePoint 2013 工作流设计之Designer 使用“可视化视图
查看>>
eclipse连hadoop2.x运行wordcount 转载
查看>>
HTML5:Details元素
查看>>
WEB前端底层知识之浏览器是如何工作的(2)--渲染引擎 BY: linFen
查看>>
ActionBar的简单应用
查看>>
IE11下不能引入外部css的解决方法
查看>>
java web 答辩总结
查看>>
BZOJ 1432: [ZJOI2009]Function(新生必做的水题)
查看>>
GUI测试含义
查看>>
javabean使用技巧
查看>>
JS/JQ综合总结
查看>>
CGAffineTransform相关函数
查看>>
字符编码与字符集区别与联系(网页/PHP文件/MYSQL数据库乱码问题)
查看>>
黑马程序员-----const和readonly的区别
查看>>
转载:基于MapXtreme的鹰眼功能
查看>>
黄聪:远程序桌面登录的.NET(C#)开发
查看>>
JMeter聚合报告(Aggregate Report)理解
查看>>
线性基
查看>>