C# 中如何获取对 ListDictionary 的同步访问

2024 年 8 月 29 日 | 4 分钟阅读

使用 ListDictionary.SyncRoot 属性获取一个可用于同步对 ListDictionary 访问的对象。ListDictionary 是一个特殊的集合。它包含在 System.Collections Specialized 命名空间中。此类型表示一个非泛型字典类型。它使用链表实现。

语法

它具有以下语法:

属性值

一个允许同步 ListDictionary 访问的对象。

1. 共享资源

在这种特定情况下,ListDictionary 是共享资源。多个线程可以同时访问和修改此集合。

2. 线程安全

线程安全是指在涉及多个线程时,共享资源能够被正确访问和更新,以防止意外行为和数据损坏。

3. 锁定机制

锁定是确保线程安全的主要方法。lock 语句是同步对 C# 中代码块或关键部分的访问的一种简单技术。

4. 同步对象

同步对象,通常称为锁对象,是线程用于协调对关键部分的访问的共享对象。它确保一次只有一个线程可以执行关键部分。

5. 关键部分

包含对共享资源的访问或修改的代码称为关键部分。它是需要防止并发访问的区域。

6. 锁定关键部分

线程使用 lock 语句获取同步对象的锁以访问关键部分。线程在进入关键部分后可以安全地操作共享资源。

7. 释放锁

线程在完成关键部分的工作后释放锁,从而允许其他线程获取它并访问关键部分

8. 并发注意事项

虽然锁确保线程安全,但它们可能导致争用并影响性能。平衡同步并尽可能允许并发至关重要。

9. 替代同步机制

根据具体要求,可以考虑其他同步技术,例如 Monitor、Mutex、Semaphore,或高级选项,例如 ReaderWriterLockSlim

10. 现代并发集合

System.Collections.Concurrent 命名空间中的并发集合在现代 C# 编程中非常有用,例如 ConcurrentDictionary

示例

让我们通过一个例子来说明如何在 C# 中获取 ListDictionary 的同步访问。

输出

Added key: 1, value: One to the dictionary.
Removed key: 1 from the dictionary.
Dictionary Count: 0

说明

1. SynchronizedListDictionary 类

在此示例中,此类提供了线程安全的字典操作方法 (Add_To_Dictionary, Remove_From_Dictionary, GetFromDictionary,DictionaryCount) 并封装了一个 ListDictionary (my_Dictionary)。

它在每个方法中使用 lock 语句来确保一次只有一个线程可以访问关键部分,并使用一个 对象 (lock_Object) 作为同步对象。

2. Add_To_Dictionary 方法

以线程安全的方式向字典添加键值对。它打印一条指示添加的消息,并使用 lock 语句同步字典访问。

3. Remove_From_Dictionary 方法

线程安全的方式从字典中删除一个键。它打印一条指示删除用户行为的消息,并使用 lock 语句同步字典访问。

4. GetFromDictionary 方法

以线程安全的方式从字典中检索一个值。它利用 lock 语句来同步字典访问。

5. DictionaryCount 属性

返回字典中键值对线程安全计数。它通过使用 lock 语句来同步字典访问。

6. Program 类 (Main 方法)

实例化一个名为 example 的 SynchronizedListDictionary 对象。

创建三个线程 (thread_1, thread_2,thread_3),它们并发执行各种字典操作 (添加、删除计数检索)。

使用 'Join' 来启动线程并等待它们完成。

从控制台读取一行,以防止程序立即退出。