线程安全的集合所在的命名空间 using System.Collections.Concurrent;
Concurrent意思是并发的,并行的。反义是sequential(顺序的),线程安全的意思就是多线程中的同步锁(Lock)
ConcurrentQueue<T> 类
表示线程安全的先进先出 (FIFO) 集合。可以与System.Collections.Generic.Queue<T> 比较。Queue<T> 在多线程中,不是线程安全的。
属性
Count | 获取 ConcurrentQueue<T> 中包含的元素数。 |
IsEmpty | 获取一个值,该值指示 ConcurrentQueue<T> 是否为空。 |
方法
Enqueue(T) | 将一个对象添加到 ConcurrentQueue<T> 的末尾。 |
TryDequeue(T) | 尝试移除并返回并发队列开头处的对象。 |
TryPeek(T) | 尝试返回 ConcurrentQueue<T> 开头处的对象但不将其移除。 |
参考微软官方文档:
https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.concurrent?view=netframework-4.5
参考源代码(类BlockingCollection<T>)
测试源程序:
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ThreadSafeCollectionDemo
{
class Program
{
static void Main(string[] args)
{
ConcurrentQueue<int> queue = new ConcurrentQueue<int>();
Task taskEnqueue1 = Task.Factory.StartNew(() =>
{
for (int i = 1; i < 21; i++)
{
queue.Enqueue(i);
}
});
Task taskEnqueue2 = Task.Run(() =>
{
for (int i = 10; i < 30; i++)
{
queue.Enqueue(i);
}
});
Task.WaitAll(taskEnqueue1, taskEnqueue2);
Console.WriteLine($"加入队列完成,目前队列中的元素:【{queue.Count}】");
Console.WriteLine();
Console.WriteLine("......现在测试同时出列......");
Task taskDequeue1 = Task.Run(() =>
{
while (queue.Count > 0)
{
int result;
if (queue.TryDequeue(out result))
{
Console.WriteLine($"线程【{Thread.CurrentThread.ManagedThreadId}】,出列【成功】;【{result}】");
}
else
{
Console.WriteLine($"线程【{Thread.CurrentThread.ManagedThreadId}】,出列【失败】;【{result}】");
}
}
});
Task taskDequeue2 = Task.Run(() =>
{
while (queue.Count > 0)
{
int result;
if (queue.TryDequeue(out result))
{
Console.WriteLine($"线程【{Thread.CurrentThread.ManagedThreadId}】,出列【成功】;【{result}】");
}
else
{
Console.WriteLine($"线程【{Thread.CurrentThread.ManagedThreadId}】,出列【失败】;【{result}】");
}
}
});
Task.WhenAll(taskDequeue1, taskDequeue2);
Console.ReadLine();
}
}
}