C# 中的 Queue.Synchronized()

17 Mar 2025 | 4 分钟阅读

C# 中的 Queue.Synchronized() 方法是 System.Collections 命名空间的一部分。此方法在常规 Queue 实例周围创建了一个线程安全的包装器。此方法在多线程环境中更有用,在多线程环境中,多个线程可能会同时访问和修改同一个 Queue。

语法

它具有以下语法:

Queue 对象是您希望通过在其周围创建一个同步包装器来使其线程安全的对象。它返回一个围绕指定的 'Queue' 的线程安全包装器。此 Queue 在多线程环境中不需要显式锁定。

存在数据损坏或意外行为的高风险。为了解决这个问题,同步机制确保只有一个线程可以同时访问数据。此方法将围绕给定的队列实例或对象创建一个同步包装器。该包装器确保队列上的每个操作都是原子且线程安全的,这意味着在正在进行的 operasi 期间,没有其他线程可以访问队列。同步队列可以在多线程上下文中使用,而无需额外的锁或同步机制。

“入队”(Enqueue)和“出队”(Dequeue)等操作以线程安全的方式进行。同步应用于各个方法调用级别。因此,每个操作都受到保护,免受其他线程的干扰。需要注意的是,它不为复合操作提供原子性。如果您需要将多个操作作为单个原子操作执行,您可能需要使用额外的同步机制或考虑使用 System.Collections.Concurrent 命名空间中的集合,该命名空间专为并发访问而设计。此方法是 C# 中传统集合类的一部分,现代 C# 代码通常使用并发集合以提高多线程场景中的性能。

示例

我们来看一个程序来演示 C# 中的 Queue.Synchronized() 方法。

输出

Queue.Synchronized() in C#

说明

程序首先导入必要的库。声明一个名为 myQueue 的 Queue 并初始化 Queue 类的新实例。它是一个非线程安全的队列。使用 Queue.Synchronized() 方法在原始 myQueue 周围创建了一个同步包装器。这使得 myQueue 成为一个线程安全的队列。这意味着多个线程可以安全地访问它,而不会导致数据损坏或意外行为。使用 Enqueue 操作将三个项目入队到同步队列中。之后,一个 while 循环从队列中删除项目。只要同步队列中有项目,while 循环就会继续。Count 属性返回队列中的元素数量。之后,Dequeue 操作删除并返回队列开头的对象。它将出队的项目打印到控制台。这些队列操作是线程安全的。如果没有同步,多个线程同时访问可能会导致不可预测和错误的行为。同步包装器有助于防止数据损坏并确保线程在访问共享队列时进行适当的协调。

示例

我们来看一个 C# 程序来演示 Queue.Synchronized() 方法。

输出

Queue.Synchronized() in C#

说明

该程序模拟了一个售票处,其中常规队列代表售票队列。使用 Queue 操作确保多线程环境中的线程安全。采用了同步方法,创建了一个同步队列。使用任务模拟并发购票,每个任务代表一个人购买一张票。同步队列确保协调访问,防止同时操作期间的数据损坏。任务将个人入队到队列中,反映成功购票。操作之间模拟的处理时间说明了程序的线程安全行为。任务完成后,程序输出一条消息,表明所有票已售出且同步队列为空。