单例模式的概念

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

关键点

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

代码

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

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

测试过程

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

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

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

C#单例测试(懒汉式双锁保证线程安全)的更多相关文章

  1. Spring -11 -单例设计模式 -懒汉式/饿汉式(idea默认的)

    单例设计模式 作用: 在应用程序有保证最多只能有一个实例. 好处: 2.1 提升运行效率. 2.2 实现数据共享. 案例:application 对象 懒汉式 3.1 对象只有被调用时才去创建. 3. ...

  2. java 单例(懒汉式)

    该示例考虑了懒汉式单例的线程安全问题

  3. filter和spring 的interceptor都是单例的,都不是线程安全的

    Filter 是在 Servlet 容器启动时就初始化的,因此可以认为是以单例对象存在的,如果一个请求线程对其中的成员变量修改的话,会影响到其他的请求线程,因此认为是多线程不安全的.

  4. 设计模式课程 设计模式精讲 8-2 单例设计模式-懒汉式及多线程Debug实战

    1 主要内容 1.1 多线程debug 1.2 synchronized同步锁的调用 1.3 懒加载的应用 2 代码演练 2.1 单线程调用 2.2 多线程调用 2.3 锁的调用 1 主要内容 1.1 ...

  5. 死锁、Lock锁、等待唤醒机制、线程组、线程池、定时器、单例设计模式_DAY24

    1:线程(理解) (1)死锁 概念: 同步中,多个线程使用多把锁之间存在等待的现象. 原因分析: a.线程1将锁1锁住,线程2将锁2锁住,而线程1要继续执行锁2中的代码,线程2要继续执行锁1中的代码, ...

  6. Java基础--单例类创建和测试

    单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在.单例模式有很多好处,它能够避免实例对象的重复创建,不仅可以减少每次创建对象的时间开销,还可以节约内存空间:能够避免由于操作多个实例导致 ...

  7. Java 单例设计模式之 饿汉式和懒汉式

    public class InstanceSampleTest { public static void main(String[] args) { /** 单例设计模式的 饿汉式和懒汉式 * 单例模 ...

  8. Java面试 - 什么是单例设计模式,为什么要使用单例设计模式,如何实现单例设计模式(饿汉式和懒汉式)?

    什么是单例设计模式? 单例设计模式就是一种控制实例化对象个数的设计模式. 为什么要使用单例设计模式? 使用单例设计模式可以节省内存空间,提高性能.因为很多情况下,有些类是不需要重复产生对象的. 如果重 ...

  9. Java-多线程与单例

    最近在公司写需求时遇到了多线程与单例一同出现的情况. 这个时候想到的就是线程安全以及单例的定义了,虽然单例指的是在内存中它只有一份,但是并不是说就是线程安全的. 所以,我当时就到网上找了关于多线程下单 ...

随机推荐

  1. #define和typedef在windows上的应用

    typedef的应用 typedef是在计算机编程语言中用来为复杂的声明定义简单的别名. 下面的代码定义了一些常见类型的别名 typedef int INT; typedef unsigned int ...

  2. Windows权限提升基础知识和命令

    介绍 这篇文章是介绍window的权限提升,虽然不是一个全面的指南,但会试图覆盖主要的技术,常用的资源列表在文章底部,可供大家参考. window权限提升基础知识 初始信息收集 在开始提权之前,我们需 ...

  3. python+selenium自动化软件测试(第13章):selenium面试题

    前言最近看到群里有小伙伴贴出一组面试题,最近又是跳槽黄金季节,小编忍不住抽出一点时间总结了下 一.selenium中如何判断元素是否存在?expected_conditions模块提供了16种判断方法 ...

  4. ORA-06575:程序包或函数处于无效状态

    今天一个朋友问我下面这段sql语句的问题,我发现了他竟然把程序员的编程思想带入了oracle,虽然是错误的,但也是很经典的错误啊. create or replace package p_view_p ...

  5. Java反射机制练习

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, Illega ...

  6. 最新Windows下Redis集群

    实现简单的Windows下Redis集群配置,以下是配置过程中出现的几个问题: [1]逐个启动7001 7002 7003 7004 7005 7006节点时,出现createing server T ...

  7. 汇编指令-adr与ldr伪汇编区别(8)

    adr :相对寻址,与当前位置有关 ldr  :绝对寻址,与当前位置无关 在初始化SDRAM时就会用到adr,代码如下: /* 初始化SDRAM */ ldr r0,=BWSCON //r0=SDRA ...

  8. TensorBoard使用

    关于TensorBoard的安装是在安装Tensorflow的过程中就已经默认安装好了,所以安装了Tensorflow就不需要再安装TensorBoard,直接使用就可以了. 具体的使用方法: 命令行 ...

  9. 入门-什么是webshell?

    webshell是什么? 顾名思义,"web" - 显然需要服务器开放web服务,"shell" - 取得对服务器某种程度上操作权限. webshell常常被称 ...

  10. 【集美大学1411_助教博客】团队作业3——需求改进&系统设计 成绩

    看到同学们越来越认真了,助教非常高兴.大家已经开始了alpha冲刺,请控制好进度.成功的关键就是不断迭代,不断迭代. 关于leangoo 我看到所有组的同学都已经开始使用leangoo,请大家把助教加 ...