当前位置:首页 > 科技  > 软件

C#中Dictionary与ConcurrentDictionary解锁多线程操作安全之道

来源: 责编: 时间:2024-04-03 09:10:20 294观看
导读使用C#中的Dictionary与ConcurrentDictionary进行多线程操作在C#中,Dictionary是一个常见的字典类型,但它不是线程安全的。为了在多线程环境中确保安全的操作,我们可以使用ConcurrentDictionary,这是一个专门设计用于多线

ALo28资讯网——每日最新资讯28at.com

使用C#中的Dictionary与ConcurrentDictionary进行多线程操作

在C#中,Dictionary是一个常见的字典类型,但它不是线程安全的。为了在多线程环境中确保安全的操作,我们可以使用ConcurrentDictionary,这是一个专门设计用于多线程场景的线程安全字典。ALo28资讯网——每日最新资讯28at.com

1. 使用Dictionary进行非线程安全操作

首先,我们来看一个使用普通的Dictionary的例子。在这个例子中,我们创建一个Dictionary对象,然后通过多个线程同时进行读取和写入操作,以演示潜在的线程安全问题。ALo28资讯网——每日最新资讯28at.com

using System;using System.Collections.Generic;using System.Threading;using System.Threading.Tasks;class Program{    static void Main()    {        // 创建一个非线程安全的 Dictionary        Dictionary<int, string> regularDictionary = new Dictionary<int, string>();        // 启动多个线程对字典进行读取和写入操作        List<Task> tasks = new List<Task>();        for (int i = 0; i < 10; i++)        {            int key = i;            tasks.Add(Task.Run(() =>            {                // 读取和写入操作                RegularDictionaryExample(regularDictionary, key);            }));        }        // 等待所有任务完成        Task.WaitAll(tasks.ToArray());        Console.WriteLine("Regular Dictionary:");        PrintDictionary(regularDictionary);        Console.ReadLine();    }    // 非线程安全的字典操作示例    static void RegularDictionaryExample(Dictionary<int, string> dictionary, int key)    {        if (dictionary.ContainsKey(key))        {            Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId}: Key {key} already exists. Value: {dictionary[key]}");        }        else        {            dictionary[key] = $"Value from Thread {Thread.CurrentThread.ManagedThreadId}";            Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId}: Key {key} added.");        }    }    // 打印字典内容    static void PrintDictionary<T, U>(Dictionary<T, U> dictionary)    {        foreach (var kvp in dictionary)        {            Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");        }    }}

2. 使用ConcurrentDictionary进行线程安全操作

接下来,我们使用ConcurrentDictionary来解决线程安全问题。ConcurrentDictionary提供了内置的线程安全机制,避免了多线程同时访问时的问题。ALo28资讯网——每日最新资讯28at.com

using System;using System.Collections.Concurrent;using System.Threading;using System.Threading.Tasks;class Program{    static void Main()    {        // 创建一个线程安全的 ConcurrentDictionary        ConcurrentDictionary<int, string> concurrentDictionary = new ConcurrentDictionary<int, string>();        // 启动多个线程对字典进行读取和写入操作        List<Task> tasks = new List<Task>();        for (int i = 0; i < 10; i++)        {            int key = i;            tasks.Add(Task.Run(() =>            {                // 读取和写入操作                ConcurrentDictionaryExample(concurrentDictionary, key);            }));        }        // 等待所有任务完成        Task.WaitAll(tasks.ToArray());        Console.WriteLine("/nConcurrent Dictionary:");        PrintDictionary(concurrentDictionary);        Console.ReadLine();    }    // 线程安全的字典操作示例    static void ConcurrentDictionaryExample(ConcurrentDictionary<int, string> dictionary, int key)    {        string value = dictionary.GetOrAdd(key, k => $"Value from Thread {Thread.CurrentThread.ManagedThreadId}");        Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId}: Key {key} {((value == null) ? "added" : "already exists")}. Value: {value}");    }    // 打印字典内容    static void PrintDictionary<T, U>(ConcurrentDictionary<T, U> dictionary)    {        foreach (var kvp in dictionary)        {            Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");        }    }}
  • Dictionary问题: 普通的Dictionary在多线程环境中可能导致数据不一致或异常,因为它不提供线程安全性。
  • ConcurrentDictionary解决方案: ConcurrentDictionary是专为多线程设计的,通过提供内置的线程安全机制,确保在多线程环境中对字典进行安全的读取和写入操作。
  • GetOrAdd方法: ConcurrentDictionaryGetOrAdd方法是线程安全的读取和写入的原子操作,可以安全地在多线程环境中使用。

通过选择适当的字典类型,可以确保在多线程应用程序中有效地管理数据,避免潜在的线程安全问题。ALo28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-81061-0.htmlC#中Dictionary与ConcurrentDictionary解锁多线程操作安全之道

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Golang VS PHP哪个更适合你?

下一篇: 强大的代码编辑器组件,你知道几个?

标签:
  • 热门焦点
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • 从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • 为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    &copy;自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • iQOO 11S或7月上市:搭载“鸡血版”骁龙8Gen2 史上最强5G Soc

    去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,iQOO 11不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞屏,同时在快充
  • 华为举行春季智慧办公新品发布会 首次推出电子墨水屏平板

    北京时间2月27日晚,华为在巴塞罗那举行春季智慧办公新品发布会,在海外市场推出之前已经在中国市场上市的笔记本、平板、激光打印机等办公产品,并首次推出搭载
Top