成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#中Dictionary與ConcurrentDictionary解鎖多線程操作安全之道

開發(fā) 后端
在C#中,Dictionary是一個常見的字典類型,但它不是線程安全的。為了在多線程環(huán)境中確保安全的操作,我們可以使用ConcurrentDictionary,這是一個專門設計用于多線程場景的線程安全字典。

使用C#中的Dictionary與ConcurrentDictionary進行多線程操作

在C#中,Dictionary是一個常見的字典類型,但它不是線程安全的。為了在多線程環(huán)境中確保安全的操作,我們可以使用ConcurrentDictionary,這是一個專門設計用于多線程場景的線程安全字典。

1. 使用Dictionary進行非線程安全操作

首先,我們來看一個使用普通的Dictionary的例子。在這個例子中,我們創(chuàng)建一個Dictionary對象,然后通過多個線程同時進行讀取和寫入操作,以演示潛在的線程安全問題。

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        // 創(chuàng)建一個非線程安全的 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.");
        }
    }

    // 打印字典內(nèi)容
    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提供了內(nèi)置的線程安全機制,避免了多線程同時訪問時的問題。

using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        // 創(chuàng)建一個線程安全的 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}");
    }

    // 打印字典內(nèi)容
    static void PrintDictionary<T, U>(ConcurrentDictionary<T, U> dictionary)
    {
        foreach (var kvp in dictionary)
        {
            Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");
        }
    }
}
  • Dictionary問題: 普通的Dictionary在多線程環(huán)境中可能導致數(shù)據(jù)不一致或異常,因為它不提供線程安全性。
  • ConcurrentDictionary解決方案: ConcurrentDictionary是專為多線程設計的,通過提供內(nèi)置的線程安全機制,確保在多線程環(huán)境中對字典進行安全的讀取和寫入操作。
  • GetOrAdd方法: ConcurrentDictionaryGetOrAdd方法是線程安全的讀取和寫入的原子操作,可以安全地在多線程環(huán)境中使用。

通過選擇適當?shù)淖值漕愋?,可以確保在多線程應用程序中有效地管理數(shù)據(jù),避免潛在的線程安全問題。

責任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2024-10-14 16:25:59

C#線程鎖代碼

2022-09-16 06:59:49

api線程安全

2009-08-17 16:56:51

C#多線程控制進度條

2009-07-17 10:37:05

C#多線程

2025-02-27 08:15:28

2011-04-25 14:42:10

C#lock

2024-10-21 16:59:37

C#編程多線程

2024-06-11 00:00:30

C#編程線程

2024-10-18 16:58:26

2024-03-12 10:25:14

C#Dictionary編程語言

2009-08-12 18:04:44

編寫C#多線程

2015-07-28 10:06:03

C#內(nèi)部實現(xiàn)剖析

2024-05-17 12:56:09

C#編程線程

2024-02-27 10:44:58

C#線程后端

2009-08-21 11:31:59

異步和多線程的區(qū)別

2009-08-28 16:43:57

C#多線程學習

2009-09-04 15:09:48

C#多線程啟動Squa

2009-08-17 16:41:03

C#多線程控制

2009-08-17 16:29:56

C#多線程控制

2009-08-26 18:13:55

C#多線程lock
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 中文字幕精品一区 | av国产在线观看 | 蜜桃五月天| 欧美a视频| 午夜影院在线观看免费 | 成人在线观看免费观看 | 99久久精品视频免费 | 超碰av免费| 成人在线视频免费观看 | 欧美性大战久久久久久久蜜臀 | 一级午夜aaa免费看三区 | 国产精品美女在线观看 | 中文字幕一区二区三区乱码图片 | 国产成人精品一区二区三区 | 欧美精品1区| 亚洲日韩视频 | 欧美大片一区二区 | 国产一区二区在线免费播放 | 日韩美av| 中文字幕一区在线 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 国产午夜精品久久久 | 少妇午夜一级艳片欧美精品 | 99热首页| a视频在线观看 | 老司机精品福利视频 | 日本又色又爽又黄的大片 | 亚洲精品视频免费 | 久久久国产一区二区三区 | 欧美狠狠操 | 精品视频在线播放 | cao视频 | 日韩在线播放第一页 | 亚洲成人一区二区 | 欧美视频三区 | 在线中文字幕第一页 | 夜夜久久 | 91在线观| 欧美中文一区 | 丁香婷婷综合激情五月色 | 亚洲欧美日韩在线 |