internal class Program
{
const string Item = "Dictionary item";
const int Iterations = 1000000;
public static string CurrentItem;
static void Main(string[] args)
{
var concurrentDict = new ConcurrentDictionary<int, string>();
var dict=new Dictionary<int,string>();
var sw = new Stopwatch();
sw.Start();
for(int i = 0; i < Iterations; i++)
{
lock(dict)
{
dict[i] = Item;
}
}
sw.Stop();
Console.WriteLine($"Writing to dict with a lock:{sw.Elapsed}"); sw.Restart();
for(int i = 0; i < Iterations; i++)
{
concurrentDict[i] = Item;
}
sw.Stop();
Console.WriteLine($"Writing to concurrent dict:{sw.Elapsed}"); sw.Restart();
for(int i = 0; i < Iterations; i++)
{
lock (dict)
{
CurrentItem = dict[i];
}
}
sw.Stop();
Console.WriteLine($"Reading from dict with a lock:{sw.Elapsed}"); sw.Restart();
for(int i = 0; i < Iterations; i++)
{
CurrentItem = concurrentDict[i];
}
sw.Stop();
Console.WriteLine($"Reading from concurrent dictionary:{sw.Elapsed}"); }
}

通过这个demo,我们可以发现:并发字典写操作比使用锁的一般字典要慢,但读要快些。因此对于字典需要大量线程安全的读操作,并发字典是比较好的选择,但如果对字典只需要多线程访问只读元素,则没有必要执行线程安全的读操作,用一般的字典或者ReadOnlyDictionary就可以胜任。

C#之并发字典的更多相关文章

  1. ConcurrentDictionary并发字典知多少?

    背景 在上一篇文章你真的了解字典吗?一文中我介绍了Hash Function和字典的工作的基本原理. 有网友在文章底部评论,说我的Remove和Add方法没有考虑线程安全问题. https://doc ...

  2. ConcurrentDictionary 并发字典

    线程安全 Dictionary 本身是不支持线程安全的 线程的字典--ConcurrentDictionary 线程安全实现 写安全 以往线程安全我们通过Lock实现 比如通过lock一个全局的obj ...

  3. 如何为非常不确定的行为(如并发)设计安全的 API,使用这些 API 时如何确保安全

    原文:如何为非常不确定的行为(如并发)设计安全的 API,使用这些 API 时如何确保安全 .NET 中提供了一些线程安全的类型,如 ConcurrentDictionary<TKey, TVa ...

  4. 设计模式之美:Iterator(迭代器)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Iterator 模式结构样式代码. 实现方式(二):实现 IEnumerable 中序遍历二叉树. 实现方式(三):实现 Bi ...

  5. 在ASP.NET Core中使用Apworks快速开发数据服务

    不少关注我博客的朋友都知道我在2009年左右开发过一个名为Apworks的企业级应用程序开发框架,旨在为分布式企业系统软件开发提供面向领域驱动(DDD)的框架级别的解决方案,并对多种系统架构风格提供支 ...

  6. 【DG】Oracle_Data_Guard官方直译

    [DG]Oracle Data Guard官方直译 1 Oracle Data Guard 介绍   Oracle Data Guard概念和管理10g版本2   Oracle Data Guard ...

  7. c#多线程总结(纯干货)

    线程基础 创建线程 static void Main(string[] args) { Thread t = new Thread(PrintNumbers); t.Start();//线程开始执行 ...

  8. Orchard详解--第五篇 CacheManager

    上一篇文章介绍了Orchard中的缓存,本篇主要针对CacheManager进行分析,CacheManager在Orchard中用于存储应用程序的配置信息以及框架内部的一些功能支持,包括整个拓展及拓展 ...

  9. NET full stack framework

    NFX UNISTACK 介绍 学习.NET Core和ASP.NET Core,偶然搜索到NFX UNISTACK,现翻译一下Readme,工程/原文:https://github.com/aumc ...

  10. NFX UNISTACK 介绍

    学习.NET Core和ASP.NET Core,偶然搜索到NFX UNISTACK,现翻译一下Readme,工程/原文:https://github.com/aumcode/nfx NFX Serv ...

随机推荐

  1. 动态能力理论&知识管理理论--商业之所见

    动态能力理论:企业整合,建立和再配置内外部资源以适应快速变化环境的能力. (1)"动态"指的是适应不断变化的环境,企业必须具有不断更新自身能力的能力: (2)"能力&qu ...

  2. Windows 提权-SeBackupPrivilege 特权

    本文通过 Google 翻译 Sebackupprivilege – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注 ...

  3. Keepalived学习,双主热备高可用

    双主热备可以看做双机主备的升级(双机主备链接 https://www.cnblogs.com/hmxs/p/12041735.html),它是为了让两台设备都能提供服务,而不是主节点正常时,备用节点一 ...

  4. Android 实现人脸识别 活体检测以及人脸搜索

    关于「保护伞FaceAI SDK」 Umbrella FaceAI SDK is on_device Offline Android Face Detection .Recognition .Live ...

  5. dcgm-exporter:Collect Switch Metrics和Collect Link Metrics

    在 DCGM(Data Center GPU Manager)中,"Collect Switch Metrics" 和 "Collect Link Metrics&quo ...

  6. Flask快速入门1

    因为新换了一个工作,项目使用了Flask框架技术,需要快速学习下,学过Django这个重量级的框架基础后,再去学习Flask框架相对还是容易的. 当然入门基础容易,要深入理解还是要慢慢花时间深耕练习使 ...

  7. 堆排序(内置模块 heapq )(NB)

    博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ import heapq # q->queue 优先队列 import r ...

  8. Linux下磁盘分区调整(在不使用LVM的情况下)

    当硬盘分区不使用LVM的时候,将不能使用lvresize等指令调整 在调整分区之前,先来了解一下当前的磁盘分区信息1:使用Fdisk指令查看后发现sda1的分区有195309568个Sectors(扇 ...

  9. Fetch 别名查找

       if (PlanClass.Attributes.Contains("new_excelcolor_avg"))                                ...

  10. Linux脚本-使用jar自动替换配置文件

    背景 最近公司需要在生产服务器上测试字库,需要非常频繁修改配置文件中的字体相关属性,然后实时调试,所以需要频繁的修改配置文件并手动发布出去.之前需要修改配置文件时,我们需要: 把jar包通过FTP传回 ...