• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
夕颜
博客园    首页    新随笔    联系   管理    订阅  订阅
C#中的Queue与ConcurrentQueue:区别与适用场景

在C#中,Queue<T> 和 ConcurrentQueue<T> 是两种不同类型的队列,它们有不同的用途和特性。以下是它们之间的主要区别以及何时使用 ConcurrentQueue<T> 的详细解释。

1.主要区别
 1.线程安全性:

    Queue<T>:不是线程安全的。如果在多线程环境中使用,需要额外的同步机制(如锁)来避免数据竞争和不一致性。
    ConcurrentQueue<T>:是线程安全的。它使用了一种无锁(lock-free)的并发机制,可以在多线程环境中安全地进行入队和出队操作,而不需要额外的同步。
2.性能:

   Queue<T>:单线程环境下性能可能更高,因为它没有额外的同步开销。
   ConcurrentQueue<T>:多线程环境下性能更高,因为它避免了锁争用和上下文切换的开销。然而,在单线程环境中,由于无锁算法的实现复杂度,它可能比 Queue<T> 稍慢。
3.API 差异:

    Queue<T>:提供了基本的入队(Enqueue)、出队(Dequeue)和查看队首元素(Peek)的方法。
    ConcurrentQueue<T>:除了基本的入队和出队方法外,还提供了 TryDequeue、TryPeek 等方法,这些方法会尝试执行操作并返回一个布尔值来表示操作是否成功。


2.使用场景
   Queue<T>:

  • 适用于单线程环境。
  • 当确定不会有多个线程同时访问队列时。
  • 当需要高性能且不需要处理线程安全问题时。

   ConcurrentQueue<T>:

  • 适用于多线程环境。
  • 当需要多个线程同时安全地访问和操作队列时。
  • 当需要避免复杂的锁管理和潜在的死锁问题时。
3.案例:
using System;
using System.Collections.Generic;
class Program
{
    static void Main()
    {
        Queue<int> queue = new Queue<int>();

        // 单线程环境下操作队列
        queue.Enqueue(1);
        queue.Enqueue(2);

        Console.WriteLine(queue.Dequeue()); // 输出: 1
        Console.WriteLine(queue.Peek());    // 输出: 2
    }
}
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        ConcurrentQueue<int> concurrentQueue = new ConcurrentQueue<int>();

        // 多线程环境下操作队列
        Parallel.Invoke(
            () => { concurrentQueue.Enqueue(1); },
            () => { concurrentQueue.Enqueue(2); }
        );
        if (concurrentQueue.TryDequeue(out int result))
        {
            Console.WriteLine(result); // 可能输出: 1 或 2,取决于线程调度
        }
        if (concurrentQueue.TryPeek(out int peekResult))
        {
            Console.WriteLine(peekResult); // 输出: 剩下的那个数,可能是 1 或 2
        }
    }
}

 

性能

这里的基准测试我对比了三种类型,Channel, BufferBlock, BlockingCollection,分别写入了10000条数据,然后进行读取,发现 Channel 确实是表现比较好。

 

原文链接:https://blog.csdn.net/x1234w4321/article/details/144209067

posted on 2025-01-06 15:04  夕颜~~  阅读(214)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3