C#之并发字典
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#之并发字典的更多相关文章
- ConcurrentDictionary并发字典知多少?
背景 在上一篇文章你真的了解字典吗?一文中我介绍了Hash Function和字典的工作的基本原理. 有网友在文章底部评论,说我的Remove和Add方法没有考虑线程安全问题. https://doc ...
- ConcurrentDictionary 并发字典
线程安全 Dictionary 本身是不支持线程安全的 线程的字典--ConcurrentDictionary 线程安全实现 写安全 以往线程安全我们通过Lock实现 比如通过lock一个全局的obj ...
- 如何为非常不确定的行为(如并发)设计安全的 API,使用这些 API 时如何确保安全
原文:如何为非常不确定的行为(如并发)设计安全的 API,使用这些 API 时如何确保安全 .NET 中提供了一些线程安全的类型,如 ConcurrentDictionary<TKey, TVa ...
- 设计模式之美:Iterator(迭代器)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Iterator 模式结构样式代码. 实现方式(二):实现 IEnumerable 中序遍历二叉树. 实现方式(三):实现 Bi ...
- 在ASP.NET Core中使用Apworks快速开发数据服务
不少关注我博客的朋友都知道我在2009年左右开发过一个名为Apworks的企业级应用程序开发框架,旨在为分布式企业系统软件开发提供面向领域驱动(DDD)的框架级别的解决方案,并对多种系统架构风格提供支 ...
- 【DG】Oracle_Data_Guard官方直译
[DG]Oracle Data Guard官方直译 1 Oracle Data Guard 介绍 Oracle Data Guard概念和管理10g版本2 Oracle Data Guard ...
- c#多线程总结(纯干货)
线程基础 创建线程 static void Main(string[] args) { Thread t = new Thread(PrintNumbers); t.Start();//线程开始执行 ...
- Orchard详解--第五篇 CacheManager
上一篇文章介绍了Orchard中的缓存,本篇主要针对CacheManager进行分析,CacheManager在Orchard中用于存储应用程序的配置信息以及框架内部的一些功能支持,包括整个拓展及拓展 ...
- NET full stack framework
NFX UNISTACK 介绍 学习.NET Core和ASP.NET Core,偶然搜索到NFX UNISTACK,现翻译一下Readme,工程/原文:https://github.com/aumc ...
- NFX UNISTACK 介绍
学习.NET Core和ASP.NET Core,偶然搜索到NFX UNISTACK,现翻译一下Readme,工程/原文:https://github.com/aumcode/nfx NFX Serv ...
随机推荐
- go、thinkphp8、webman数据读取并发测试、性能测试
前期准备:本地搭建程序运行所需环境,分别编写go,thinkphp8和webman程序,确保程序运行正常,新建mysql的student表,模拟存储学生信息,共计3646条数据,分别使用go语言.th ...
- php-fpm 启动后没有监听端口9000
netstat -tpln未发现监听9000端口.查看/var/log/php7-fpm.log一切正常. 随后查看PHP配置文件:/usr/local/php/etc/php-fpm.conf (源 ...
- HoloLens 2 开发推荐书籍
博客地址:https://www.cnblogs.com/zylyehuo/ 书名 HoloLens 2开发入门精要--基于Unity和MRTK http://www.tup.tsinghua.edu ...
- oracle各种字符集修改
select * from v$nls_parameter会显示nls_characterset和nls_nchar_characterset的值 修改字符集nls_characterset和nls_ ...
- 一次windows下使用cmake遇到的问题
背景 在windows下的cmake和mingw提供的make,在windows环境下进行了简单尝试,结果发现make的时候失败: #include <iostream> int main ...
- HTB打靶记录-Vintage
信息收集 nmap -sV -sC -O 10.10.11.45 Nmap scan report for 10.10.11.45 Host is up (2.1s latency). Not sho ...
- 重生之我是操作系统(五)----CPU调度
简介 当CPU有大量任务要处理,但由于资源有限,无法同时处理.所有就需要某种规则来决定任务处理的顺序,这就是调度. 调度层次 根据调度频率与层次,共分为三种 高级调度 也称为作业调度(Long-Tre ...
- RL · Exploration | 使用时序距离构造 intrinsic reward,鼓励 agent 探索
论文标题:Episodic Novelty Through Temporal Distance. ICLR 2025,8 8 6 5 poster. arxiv:https://arxiv.org/a ...
- 从零实现富文本编辑器#2-基于MVC模式的编辑器架构设计
在先前的规划中我们是需要实现MVC架构的编辑器,将应用程序分为控制器.模型.视图三个核心组件,通过控制器执行命令时会修改当前的数据模型,进而表现到视图的渲染上.简单来说就是构建一个描述文档结构与内容的 ...
- 康谋分享 | 从CAN到CAN FD:ADTF在汽车网络中的应用
随着汽车电子技术的发展,车辆上配备了越来越多的电子装置,这些设备多采用点对点的方式通信,这也导致了车内存在庞大的线束.造成汽车制造和安装的困难并进一步降低汽车的配置空间,汽车总线逐步开始向网络化方向发 ...