c# 多线程单例模式_单例模式,多线程单例,双重锁定单例,工场单例创建上下文...
单例模式,多线程单例,双重锁定单例,工厂单例创建上下文。
单例子模式定义
保证一个类仅有一个实例,并提供一个访问它的全局访问点.
通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是让类自身负责保存它的唯一实例。这个类可以保证没有其它实例可以呗创建并且它可以提供一个访问该实例的方法,这就是单例模式。
单例子模式简单实现
Singleton类定义了一个GetInstance 操作,允许客户访问它的唯一实例,GetInstance是一个静态方法,主要负责创建自己的唯一实例。
public class Singleton
{
private static Singleton _instance;
private Singleton()//私有化构造函数,阻止外界利用new关键词来创建实例
{}
public static Singleton GetInstance()
{
return _instance ?? (_instance = new Singleton());
}
}
测试代码
public void Myaction()
{
var s1 = Singleton.GetInstance();
var s2 = Singleton.GetInstance();
if (s1 == s2)
{
Console.WriteLine("两个对象是相同的!");
}
Console.Read();
}
多线程时的单例
上面的代码在多线程的程序下运行明细是有问题的,当多个线程同时访问Singleton类 都调用GetInstance()方法,就有可能会创建多个实例。
这种情况我们可以给进程一把锁来处理,这里需要理解 lock 语句的涵义,lock 是确保当前一个线程位于代码的临界区时,另一个线程不进入临界区。如果其它线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。
简单实现
public class Singleton
{
private static Singleton _instance;
//程序执行时创建一个静态的只读的进程辅助对象
private static readonly object SyncRoot = new object();
private Singleton()//私有化构造函数,阻止外界利用new关键词来创建实例
{ }
public static Singleton GetInstance()
{
lock (SyncRoot)//在同一时刻加了锁的那部分程序只有一个线程可以进入
{
_instance= _instance ?? (_instance = new Singleton());
}
return _instance;
}
}
双重锁定(Double-Check Locking)
通过上面的例子我们不难发现当我们每次调用 GetInstance() 方法时都要 lock 这种做法显然是影响性能的所以我们需要再加一层判断
简单实现
public class Singleton
{
private static Singleton _instance;
//程序执行时创建一个静态的只读的进程辅助对象
private static readonly object SyncRoot = new object();
private Singleton()//私有化构造函数,阻止外界利用new关键词来创建实例
{}
public static Singleton GetInstance()
{
if (_instance == null)//先判断实例是否存在,不存在在枷锁处理
{
lock (SyncRoot)//在同一时刻加了锁的那部分程序只有一个线程可以进入
{
_instance = _instance ?? (_instance = new Singleton());
}
}
return _instance;
}
}
工厂单例创建数据上下文
我们在开发过程中经常都需要对数据上下文进行单例,所以这里结合简单工厂 来实现数据上下文的创建
简单实现
public class DbFactory
{
private static readonly object SyncRoot=new object();
private DbFactory()
{}
#region 获取当前的上下文对象
///
/// 单例工厂 获取当前的上下文对象 //考虑多线程情况
///
///
public static SiyoukuContext GetCurrentDbContext()
{
var context = (SiyoukuContext) CallContext.GetData("DbContext"); //从数据槽获取
if (context == null)
{
lock (SyncRoot)//双重锁定
{
if (context == null)
{
//如果不存在 ,则实例化一个上下文对象
context = new SiyoukuContext();
CallContext.SetData("DbContext", context);
}
}
}
return context;
}
#endregion
}
本文记录了自己对单例模式的总结
c# 多线程单例模式_单例模式,多线程单例,双重锁定单例,工场单例创建上下文...相关推荐
- java静态内部类单例模式_单例模式-静态内部类实现及原理剖析
以我的经验为例(如有不对欢迎指正),在生产过程中,经常会遇到下面两种情况: 1.封装的某个类不包含具有具体业务含义的类成员变量,是对业务动作的封装,如MVC中的各层(HTTPRequest对象以Thr ...
- java bean 单例模式_单例模式 - Beans_bag - 博客园
1.单例模式的简介 定义 保证每个类仅有一个实例,并给外部提供一个访问它的全局访问点. 思路 如果一个类能够被创建多个实例,那么,这个类的构造方法肯定是公开的,外部通过此类的构造方法可以创建多个类的实 ...
- java 多线程输出_[Java多线程]ABC三个线程顺序输出的问题
大概的问题是这样的: 有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C 要求, 同时启动三个线程, 按顺序输出ABC, 循环10次 这是一个多线程协同的问题, 本身多线程是没有执行 ...
- Qt笔记-多线程检索数据库(单例多重锁,QtConcurrent::blockingMapped)
这里主要是个事例,并不涉及业务逻辑处理.在此记录下. 程序运行截图如下: 这里有下面这个类BigDataTest对数据进行的类. MySQLInstance采用单例双重锁模式对数据库进行操作. 源码如 ...
- python3的配置文件类单例实现_单例模式的几种实现方式及对比
来源:博客园 作者:为何不是梦 链接:https://www.cnblogs.com/ibigboy/p/11423613.html 所谓单例就是在系统中只有一个该类的实例. 单例模式的核心分以下三个 ...
- 静态内部类实现单例_单例模式详解
概述 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,使用单例模式的类只有一个对象实例. 单例应用场景 Windows系统的任务管理器. ...
- java 多线程的单例模式,Java多线程中的单例模式两种实现方式
Java多线程中的单例模式 一.在多线程环境下创建单例 方式一: package com.ietree.multithread.sync; public class Singletion { priv ...
- Python多线程下实现单例模式,以及limit实例模式
多线程环境下实现单例模式 下面介绍了两种Python实现单例模式的方法 1.重写__new__方法实现多线程情况下的单例模式 用new方法实现单例模式 import time, threadingcl ...
- C++单例模式:单例模式遇到多线程
单例模式介绍 单例模式主要有2中形式,一种是饿汉式,一种是懒汉式. 饿汉式:程序一加载单例模式就已经创建了,也就很饥饿嘛.因为是静态属性进行单例初始化,所以优点是线程是安全的,缺点是无论用户是否使用单 ...
最新文章
- PNAS:微生物组分析揭示人类皮肤的独特性
- boost::safe_numerics::base_type相关的测试程序
- lol人物模型提取(五)
- Hibernate中保存与持久性以及saveOrUpdate之间的区别
- oracle数据库存大文本,Oracle大文本在ASP中存取问题的解决
- Android Sdk 国内镜像下载地址
- 卡尔曼_卡尔曼滤波最完整公式推导
- NetBSD Make源代码阅读二:链表之创建与销毁
- canvas瓦片图加载
- linux cuda 编程指南,CUDA编程指南阅读笔记
- FAT32文件系统详解
- JSON 对比工具,优秀的JSON对比工具,文件内容对比
- 普通电机、步进电机、伺服电机、舵机区别?
- 给PDF文件添加图片的方法
- 不是吧?DNSPod挪车码免费送?
- 单片机 STM32 HAL PCF8574 例子代码
- 4H5样式控制CSS1-美化网页元素
- 大聪明教你学Java | 程序员的专属新年对联
- Java基础--object类详解
- std::this_thread::sleep_for 使用
热门文章
- Java虚拟机-逃逸分析(Escape Analysis)和栈上分配
- 使用easyexcel导出时行高不自动调整的解决
- 算法高级(30)-外卖凑单算法-为什么每次点外卖你怎么都凑不够那碗卤肉饭呢?
- Lucene6.5.0 下中文分词IKAnalyzer编译和使用
- Spring Boot系列教程七:Spring boot集成MyBatis
- php7 memcached sasl,Mac安装memcached扩展支持sasl
- C语言编程序编数独,求用C语言编一个解九宫格数独的程序怎么办? 爱问知识人...
- Android ListView and Tips.
- React Native商城项目实战04 - 封装TabNavigator.Item的创建
- ORA-09925: Unable to create audit trail file 在DBCA时