首页 > 编程语言 >c#提供的线程安全封装类BlockingCollection与lock的区别及优点

c#提供的线程安全封装类BlockingCollection与lock的区别及优点

时间:2022-12-18 18:44:34浏览次数:50  
标签:Count tasklist Console c# lock 线程 WriteLine new

 提供的线程安全封装类:

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

标签:Count,tasklist,Console,c#,lock,线程,WriteLine,new
From: https://www.cnblogs.com/csj007523/p/16990754.html

相关文章

  • python中将assert断言放在try except中,失败断言运行后的结果也会是成功
    问题:将assert语句放进tryexcept中,用例执行后,哪怕断言失败,最后pytest返回的结果也是成功的,这样就无法判断哪些用例失败,哪些用例成功解决方法:在except代码中,添加raise,将异常......
  • SpringCloud微服务框架复习笔记
    SpringCloud微服务框架复习笔记什么是微服务架构?微服务是一种软件开发技术,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每......
  • 如何创建class library类库?
    首先创建一个控制台应用程序,如下      在“解决方案...”上面右击,依次选择“添加”-“新建项目”在弹开的窗口中,选择“类库”,并命名为“SomeClassLibrary”......
  • Docker进阶--Docker Compose
    Docker进阶DockerCompose一、定义:compose是Docker官方开源项目,轻松管理容器、定义运行多个容器应用,批量容器编排。二、使用过程定义、运行多个容器YAML配置文......
  • 【ASP.NET Core】MVC操作方法如何绑定Stream类型的参数
    咱们都知道,MVC在输入/输出中都需要模型绑定。因为HTTP请求发送的都是文本,为了使其能变成各种.NET类型,于是在填充参数值之前需ModelBinder的参与,以将文本转换为.NET类......
  • 初识C语言(了解)
    计算机语言的发展什么是C语言?计算机语言是人与计算机交流的语言,C语言是计算机语言。此外计算机语言还有c++、jave、py等语言。计算机语言的发展二进制语言电脑是硬件,只能识......
  • DRF视图集中添加其他API--@action装饰器
    问题:DRF视图集中若想添加其他API?通过给视图集中的函数,添加DRF的@action()装饰器DRF的@action装饰器,用来为函数添加路由,主要参数有:methods:支持的请求方式,值为一个列表,默......
  • 如何实现chrome谷歌浏览器多开(独立环境 独立cookie)
    由于各种各样的原因,你可能需要在一个电脑登录某个平台,比如一个电脑登录3个公众号,或者3个知乎等等。最简单的方案是,直接安装3个不同的浏览器,比如一个谷歌浏览器,一个火狐浏......
  • 【LeeCode】338. 比特位计数
    【题目描述】给你一个整数 ​​n​​ ,对于 ​​0<=i<=n​​ 中的每个 ​​i​​ ,计算其二进制表示中 ​​1​​​​ 的个数 ,返回一个长度为 ​​​n+1​​......
  • CSharp: Mediator Pattern in donet core 6
     ///<summary>///中介者模式MediatorPattern亦称:调解人、控制器、Intermediary、Controller、Mediator///</summary>publicabstractclassUser......