自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

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

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);
            }));
        }

        // 等待所有任務(wù)完成
        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);
            }));
        }

        // 等待所有任務(wù)完成
        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)境中可能導(dǎo)致數(shù)據(jù)不一致或異常,因為它不提供線程安全性。
  • ConcurrentDictionary解決方案: ConcurrentDictionary是專為多線程設(shè)計的,通過提供內(nèi)置的線程安全機制,確保在多線程環(huán)境中對字典進行安全的讀取和寫入操作。
  • GetOrAdd方法: ConcurrentDictionaryGetOrAdd方法是線程安全的讀取和寫入的原子操作,可以安全地在多線程環(huán)境中使用。

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

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

2022-09-16 06:59:49

api線程安全

2024-10-14 16:25:59

C#線程鎖代碼

2009-07-17 10:37:05

C#多線程

2009-08-17 16:56:51

C#多線程控制進度條

2025-02-27 08:15:28

2024-10-21 16:59:37

C#編程多線程

2011-04-25 14:42:10

C#lock

2024-10-18 16:58:26

2024-06-11 00:00:30

C#編程線程

2009-08-12 18:04:44

編寫C#多線程

2024-03-12 10:25:14

C#Dictionary編程語言

2015-07-28 10:06:03

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

2024-02-27 10:44:58

C#線程后端

2024-05-17 12:56:09

C#編程線程

2009-09-04 15:09:48

C#多線程啟動Squa

2009-08-28 16:43:57

C#多線程學習

2009-08-21 11:31:59

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

2009-08-17 16:29:56

C#多線程控制

2009-08-17 16:41:03

C#多線程控制

2024-12-23 09:09:54

點贊
收藏

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