ConcurrentDictionary:
ConcurrentDictionary 是 .NET 中提供的线程安全的字典类型,适用于多线程环境下的并发操作。它允许多个线程同时读写字典,而不需要额外的锁机制。适用于需要高并发读写操作的场景,如多线程并发访问的缓存、共享资源管理等。
Dictionary:
Dictionary 是非线程安全的字典类型,适用于单线程或者在多线程环境中确保只有一个线程访问的情况。在多线程环境下使用 Dictionary 需要使用额外的同步手段,如锁,以确保线程安全。
ConcurrentDictionary 和 Dictionary 的主要区别在于线程安全性。ConcurrentDictionary 内部采用了一种分段锁的机制,允许多个线程同时进行读写操作,而 Dictionary 则需要外部手动加锁来确保线程安全。
ConcurrentDictionary 原理:
ConcurrentDictionary 内部使用了一组分段锁,每个段(segment)都是一个独立的字典,不同的线程可以同时访问不同的段,从而实现高并发的读写操作。这种设计在绝大多数情况下能够提供较好的性能,因为不同的线程并不会相互阻塞。
Dictionary 原理:
Dictionary 是基于哈希表实现的,具体而言,它使用键的哈希码来确定存储位置。在多线程环境中,如果不加额外的同步措施,多个线程同时对一个 Dictionary 进行读写操作可能会导致数据不一致的问题。
AddOrUpdate:
添加或更新指定键的值。
var concurrentDict = new ConcurrentDictionary<string, int>();
concurrentDict.AddOrUpdate("key1", 1, (key, oldValue) => oldValue + 1);
GetOrAdd:
获取键的值,如果不存在则添加。
var value = concurrentDict.GetOrAdd("key2", 2);
Add:
添加键值对。
var dict = new Dictionary<string, int>();
dict.Add("key1", 1);
TryGetValue:
尝试获取与指定键关联的值。
int value;
if (dict.TryGetValue("key1", out value))
{
// 处理存在的情况
}
创建 ConcurrentDictionary 对象。
var concurrentDict = new ConcurrentDictionary<string, int>();
使用 AddOrUpdate 或 GetOrAdd 方法进行并发安全的操作。
concurrentDict.AddOrUpdate("key1", 1, (key, oldValue) => oldValue + 1);
创建 Dictionary 对象。
var dict = new Dictionary<string, int>();
使用 Add、TryGetValue 等方法进行操作,需要确保在多线程环境中添加额外的同步措施。
dict.Add("key1", 1);
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
class Program
{
static void Main()
{
var concurrentDict = new ConcurrentDictionary<string, int>();
// 并发添加或更新
Parallel.For(0, 100, i =>
{
concurrentDict.AddOrUpdate("key1", 1, (key, oldValue) => oldValue + 1);
});
Console.WriteLine("ConcurrentDictionary Value: " + concurrentDict["key1"]);
}
}
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
class Program
{
static void Main()
{
var dict = new Dictionary<string, int>();
var lockObject = new object();
// 多线程环境下手动加锁
Parallel.For(0, 100, i =>
{
lock (lockObject)
{
if (!dict.ContainsKey("key1"))
{
dict.Add("key1", 1);
}
else
{
dict["key1"]++;
}
}
});
Console.WriteLine("Dictionary Value: " + dict["key1"]);
}
}
ConcurrentDictionary:
Dictionary:
ConcurrentDictionary 提供了高效的并发读写操作,适用于多线程环境下的字典操作,而 Dictionary 则需要手动管理线程安全性。在选择使用时,根据具体场景选择合适的字典类型,以提高程序性能和可维护性。在高并发场景下,推荐使用 ConcurrentDictionary 来简化线程安全性的处理。