c#提供的线程安全封装类BlockingCollection与lock的区别及优点
提供的线程安全封装类:
//1. 引入System.Collections.Concurrent命名---线程安全数据结构
//2. 把之前的非线程安全的数据结构更换成以下数据结构即可;
{
//List<int> tasklist = new List<int>();
//BlockingCollection<int> blockinglist = new BlockingCollection<int>();
//ConcurrentBag<int> conocurrentbag = new ConcurrentBag<int>();
//ConcurrentDictionary<string, int> concurrentDictionary = new ConcurrentDictionary<string, int>();
//ConcurrentQueue<int> concurrentQueue = new ConcurrentQueue<int>();
//ConcurrentStack<int> concurrentStack = new ConcurrentStack<int>();
////OrderablePartitioner<int> OrderablePartitioner = new OrderablePartitioner<int>();
////Partitioner<int> partitionerArray=new
////Partitioner
//for (int i = 0; i < 10000; i++)
//{
// int k = i;
// Task.Run(() =>
// {
// tasklist.Add(k);
// blockinglist.Add(k);
// conocurrentbag.Add(k);
// concurrentDictionary.TryAdd($"concurrentDictionary_{k}", k);
// concurrentQueue.Enqueue(k);
// concurrentStack.Push(k);
// });
//}
//Console.WriteLine($"tasklist:{tasklist.Count()}");
//Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//Console.WriteLine($"blockinglist{blockinglist.Count()}");
//Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//Console.WriteLine($"conocurrentbag{conocurrentbag.Count()}");
//Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//Console.WriteLine($"concurrentDictionary{concurrentDictionary.Count()}");
//Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//Console.WriteLine($"concurrentQueue{concurrentQueue.Count()}");
//Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//Console.WriteLine($"concurrentStack{concurrentStack.Count()}");
//Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
}
//B:Lock,锁---排他性,独占;
//标准锁:锁对象,引用类型,不要锁string,可能会冲突;
//强烈规定:以后大家使用lock,按照这种标准格式;private static readonly object obj_Forom = new object();
//int,string,this 都不要;
{
List<int> tasklist = new List<int>();
for (int i = 0; i < 10000; i++)
{
int k = i;
Task.Run(() =>
{
lock (obj_Forom) //只允许一个线程从这里经过,这不就是单线程了吗? 反多线程;
{
tasklist.Add(k);
}
});
}
Console.WriteLine($"tasklist:{tasklist.Count()}");
}
string str01 = "x'x'x";
string str02 = "yyy";
//C:还有没有其他的方案
//线程安全问题一般发生在全局变量、共享变量、硬盘文件,只要是多线程都能访问和修改的公共数据;
//既然既然多线程去操作会有线程安全问题,那么就拆分数据源,然后每一个线程对标于单独的某一个数据块;
//多线程操作完毕以后,再合并数据;在后续爬虫实战会有应用;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2017-12-18 DeepNLP的核心关键/NLP词的表示方法类型/NLP语言模型 /词的分布式表示/word embedding/word2vec