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:还有没有其他的方案
//线程安全问题一般发生在全局变量、共享变量、硬盘文件,只要是多线程都能访问和修改的公共数据;
//既然既然多线程去操作会有线程安全问题,那么就拆分数据源,然后每一个线程对标于单独的某一个数据块;
//多线程操作完毕以后,再合并数据;在后续爬虫实战会有应用;