多线程学习笔记第3篇

多线程学习笔记第3篇

  前言:这篇博客主要是在上一篇博客的基础上,继续记录了死锁,线程同步和线程池的一些知识,方便我以后继续的学习,在这里贴出来和大家共享一下

1. 对象池技术模拟

  (1) 如果一些对象创建非常消耗时间和资源,使用非常频繁,这时候可以考虑使用对象池技术

  (2)对象池其实就是一个数组,当我们想用一个对象的时候直接从池子里面取,别的对象也可以从池子里面取

  (3)使用代码模拟对象池Demo添加锁

  (4)数据库模仿锁

       1)select * from bank with(nolock) --表示当前表做查询的时候不加锁

  (5)解决死锁的方法是操作资源的顺序一致

2. 线程同步

  (1) 参考上面的案例代码进行说明

  (2)new在堆上申请内存空间后干了什么

       1)Object objLock = new object();

       2)开辟内存

       3)调用构造函数

       4)同步块索引(复数)

  (3)Lock(语法糖)

       try

       {

              System.Threading.Monitor.Enter(obj);

       }

      finally

       {

              System.Threading.Monitor.Exit(obj);

       }

  (4)lock这段代码是怎么运行的,lock语句根本使用的就是Monitor.Enter和Monitor.Exit,也就是说lock(o)时执行Monitor.Enter(this), 大括号结束时执行Monitor.Exit(this).他的意义在于什么呢,对于任何一个对象来说,他在内存中的第一部分放置的是所有方法的地址,第二部分放着一个索引,他指向CLR中的SyncBlock Cache区域中的一个SyncBlock.什么意思呢?就是说,当你执行Monitor.Enter(Object)时,如果object的索引值为负数,就从SyncBlock Cache中选区一个SyncBlock,将其地址放在object的索引中。这样就完成了以object为标志的锁定,其他的线程想再次进行Monitor.Enter(object)操作,将获得object为正数的索引,然后就等待。直到索引变为负数,即线程使用Monitor.Exit(object)将索引变为负数。

  (5)线程同步解决的问题:解决多个线程同时访问同一个资源的时候,进行同步。同一个时间,我们的资源只允许一个线程来访问。

3. 线程池

  (1) 在程序中,如果某个创建某种对象所需要的代价太高,同时这个对象又可以反复使用,那么我们往往就会准备一个容器,用来保存一批这样的对象。于是乎,我们想要用这种对象时,就不需要每次去创建一个,而直接从容器中取出一个现成的对象就可以了。由于节省了创建对象的开销,程序性能自然就上升了

  (2)ThreadPool class提供了一个线程池,该线程池可用于发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。 线程池允许在后台运行多个工作,而不需要为每个任务频繁地创建和销毁单独的线程,从而减少了开销。

  (3)普通的Windows应用程序(如控制台或WinForm/WPF),会将其设置为"处理器数 * 250"。也就是说,如果您的机器为2个2核CPU,那么CLR线程池的容量默认上限便是1000,也就是说,它最多可以管理1000个线程同时运行

  (4)WaitCallback是一个委托类型,查看源码是:

       public delegate void WaitCallback(object state);

  (5)线程池Demo

  (6)线程池支持的最大线程数1023个,默认设置是1000,最小0.

     (7)等待线程执行结束

     (8)工作项

作者:韩迎龙
出处:http://www.cnblogs.com/hanyinglong
QQ群:208583543
本页版权归作者和博客园所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利

分类: C#
原文地址:https://www.cnblogs.com/Leo_wl/p/2744675.html