张德长

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

ConcurrentBag线程安全,List线程不安全,示例

class Program
{
static void Main(string[] args)
{
ListTest();
ConcurrentBagTest();
}
public static void ConcurrentBagTest()
{
ConcurrentBag<int> bag = new ConcurrentBag<int>();
List<Task> taskList = new List<Task>();
for (int i = 0; i < 100; i++)
{
int numberToAdd = i;
taskList.Add(Task.Run(() => bag.Add(numberToAdd)));
}
Task.WaitAll(taskList.ToArray());
List<Task> consumeTaskList = new List<Task>();
int count = 0;
while (!bag.IsEmpty)
{
consumeTaskList.Add(Task.Run(() =>
{
int temp;
if (bag.TryTake(out temp))
{
Console.Write(temp+",");
count++;
}
}
));
}
Task.WaitAll(consumeTaskList.ToArray());
Console.WriteLine();
Console.WriteLine($"ConcurrentBag中元素个数{count}");
int unexpectedItem;
if (bag.TryTake(out unexpectedItem))
Console.WriteLine($"ConcurrentBag中元素{unexpectedItem}");
}
public static void ListTest()
{
List<int> list = new List<int>();
List<Task> taskList = new List<Task>();
for (int i = 0; i < 100; i++)
{
int numberToAdd = i;
taskList.Add(Task.Run(() => list.Add(numberToAdd)));
}
Task.WaitAll(taskList.ToArray());
for (int i = 0; i < list.Count; i++)
{
Console.Write(list[i]+",");
}
Console.WriteLine();
Console.WriteLine($"list中元素个数{list.Count}");
Console.WriteLine("--------------------------------");
}
}

 

List每次运行结果都不尽相同,体现了其多线程的不安全性

posted on   张德长  阅读(124)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示