.NET中线程同步的几种方法
lock、Monitor:
lock是Monitor的语法糖
[MethodImpl(MethodImplOptions.Synchronized)]:
特性标记一个方法是需要被同步的,最终实现的效果与使用lock关键字相同。
SpinLock:
自旋锁,当SpinLock请求进入临界区时,会反复地旋转(执行空循环),直至锁变为可用的。如果请求锁所需时间非常短,则空转可比阻塞提供更好的性能,因为不换切换线程。但是,如果锁保留数十个周期以上,则SpinLock性能很差。
Mutex:
Mutex的作用也是创建一个临界区以同步对其中对象的访问,方式类似Monitor类,但最大的不同是Mutex支持跨进程的同步。当然其效率也不如Monitor类,在同一进程内通信应首先考虑使用Monitor。
以上都属于排它锁,有时候不需要独占,可以允许一定数量的线程并发访问某个资源。
ReaderWriterLock、ReaderWriterLockSlim:
允许多个线程同时读取一个资源,但在向该资源写入时要求线程等待以获得独占锁。
Semaphore、SemaphoreSlim:
Semaphore类允许指定数目的线程访问某个资源。超过这个数目时,请求该资源的其他线程会一直阻塞,直到某个线程释放信号量。
通知:通知机制是等待另一个线程的信号的所有方法的统称。
Join()方法
AutoResetEvent、ManualResetEvent:
CountdownEvent:CountdownEvent的作用与Semaphore相反,Semaphore中设置了最大可用槽数,当计数为0时(即资源不够用时)则阻塞线程。而CountdownEvent用来统计其它线程结束工作的情况,当监听数变为0时,触发信号。
Barrier:利用 Barrier 类,可以对多个线程进行循环同步,以便它们都在同一个点上阻塞来等待其他线程完成。
Mutex类/ Semaphore类:这两个类均派生自WaitHandle,所以它们均可与WaitHandle的静态方法一起使用。例如,线程可以使用WaitAll方法/WaitAny方法等待,而以下三个条件均可以使这个线程解除阻塞:EventWaitHandle接收到信号,Mutex被释放,Semaphore被释放。
参考:https://www.cnblogs.com/gjhjoy/p/3544361.html
最新文章
- MySQL全文索引 FULLTEXT索引和like的区别
- iOS之数据解析时<;null>;的处理
- Mysql Error: Host ‘xxx.xxx.xxx.xxx’ is not allowed to connect to
- 05Mybatis_入门程序——根据id查询用户
- JS通过getBoundingClientRect获取的height可能与css设置的height不一致
- 【原】Gradle调用shell脚本和python脚本并传参
- Thinkphp关闭缓存方法总结(转)
- OpenJudge计算概论-求分数序列和
- Windows Kernel Way 扉言
- css中的字体样式及元素样式
- 连接pgsql
- [Unity]SQLite-C#调用
- java学习笔记之线程(Thread)
- let 和 var定义变量的区别-盼盼Degenerate
- 20175312 2018-2019-2 《Java程序设计》结对编程练习_四则运算(第一周:阶段性总结)
- Charles篡改后台数据
- 【原创】大叔经验分享(33)hive select count为0
- 谈谈如何给下拉框option添加点击事件?
- Linux学习笔记:常用命令
- HanLP中的人名识别分析详解