1     internal sealed class SimpleHybridLock : IDisposable
 2     {
 3         //基元用户模式构造使用
 4         private int m_waiters = 0;
 5
 6         //基元内核模式构造
 7         private AutoResetEvent m_waiterLock = new AutoResetEvent(false);
 8
 9         public void Enter()
10         {
11             //指出该线程想要获得锁
12             if (Equals(Interlocked.Increment(ref m_waiters), 1))
13             {
14                 //无竞争,直接返回
15                 return;
16             }
17
18             //另一个线程拥有锁(发生竞争),使这个线程等待
19             //线程会阻塞,但不会在CPU上“自旋”,从而节省CPU
20             //这里产生较大的性能影响(用户模式与内核模式之间转换)
21             //待WaitOne返回后,这个线程拿到锁
22             m_waiterLock.WaitOne();
23         }
24
25         public void Leave()
26         {
27             //该线程准备释放锁
28             if (Equals(Interlocked.Decrement(ref m_waiters), 0))
29             {
30                 //无线程等待,直接返回
31                 return;
32             }
33
34             //有线程等待则唤醒其中一个
35             //这里产生较大的性能影响(用户模式与内核模式之间转换)
36             m_waiterLock.Set();
37         }
38
39         public void Dispose()
40         {
41             m_waiterLock.Dispose();
42         }
43     }

转载于:https://www.cnblogs.com/xuejietong/p/8640888.html

简单混合锁(HybridLock)相关推荐

  1. C# lock 语法糖实现原理--《.NET Core 底层入门》之自旋锁,互斥锁,混合锁,读写锁...

    在多线程环境中,多个线程可能会同时访问同一个资源,为了避免访问发生冲突,可以根据访问的复杂程度采取不同的措施 原子操作适用于简单的单个操作,无锁算法适用于相对简单的一连串操作,而线程锁适用于复杂的一连 ...

  2. 第十三节:实际开发中使用最多的监视锁Monitor、lock语法糖的扩展、混合锁的使用(ManualResetEvent、SemaphoreSlim、ReaderWriterLockSlim)

    一. 监视锁(Monitor和lock) 1. Monitor类,限定线程个数的一把锁(Synchronized lock是他的语法糖),两个核心方法: Enter:锁住某个资源. Exit:退出某一 ...

  3. 简单鲁班锁拼装技巧_3个简单的技巧来消除背景时,丑陋的边缘

    简单鲁班锁拼装技巧 If you cut out a lot of objects from photographs, chances are you've run across a few roug ...

  4. 详解go中的混合锁 - mutex

    0 前言 我们知道,多线程下为了确保数据不会出错,必须加锁后才能访问共享资源.常见的锁包括互斥锁.自旋锁.读写锁等等,往往需要通过系统内核来实现. 然而协程的互斥锁实现原理完全不同,它并不与内核打交道 ...

  5. Android 实现简单的锁屏功能

    写正题之前先闲扯几句.因为前段时间自己的手机电源键不灵,所以手机不能及时锁屏,一度让我很苦恼,后来通过在系统设置找到一个另类的方法,设置让音量键锁屏,最终也解决了问题,但是觉得还是不够爽,作为程序员, ...

  6. C#线程锁(自旋锁SpinLock、互斥锁Mutex、混合锁Monitor | lock)

    一.自旋锁 自旋锁是指当一个线程在获取锁对象的时候,如果锁已经被其它线程获取,那么这个线程将会循环等待,不断的去获取锁,直到获取到了锁.适合于原子操作时间非常短的场景 优点:避免了线程上下文切换.性能 ...

  7. python简单代码-Python简单进程锁代码实例

    先说说线程 在多线程中,为了保证共享资源的正确性,我们常常会用到线程同步技术. 将一些敏感操作变成原子操作,保证同一时刻多个线程中只有一个线程在执行这个原子操作. 我最常用的是互斥锁,也称独占锁.其次 ...

  8. 什么是锁PHP,PHP简单分布式锁-PHP中的锁

    对于PHP的锁,其实并没有什么太多的概念.抛弃一些第三方的依赖,看看有哪些可用的选择. 文件锁 PHP的sync扩展 PHP的opcache中的apc_add 目前可以想到的就这么多,在该项目中我们采 ...

  9. redis简单分布式锁实现 超简单的那种

    1.下载安装启动redis 网上教程很多 不说了 2. 先创建一个简单的Springcloud项目 <?xml version="1.0" encoding="UT ...

最新文章

  1. ImportError: No module named _ssl解决方法
  2. 配置arm-linux-gcc 位置
  3. 不只是相关:基于真理共识论的社区问答可信答案选择新方法
  4. 通信开源linux,Linux环境进程间通信
  5. ExtJS4.2学习(21)动态菜单与表格数据展示操作总结篇2
  6. 二叉树的前序、中序、后序遍历及互相求法
  7. SpringMVC+Thymeleaf +HTML的简单框架
  8. L3-019 代码排版 (30 分)-PAT 团体程序设计天梯赛 GPLT
  9. 计算机多媒体技术专业论文,多媒体技术论文
  10. 哲学家进餐问题 C++实现
  11. idea社区版和企业版区别_idea 社区版开发 springboot及问题
  12. Calendar根据输入的年份和周数计算该周的开始日期和结束日期
  13. Qt报错 error: C1083
  14. 宁盾无线认证对接锐捷EG3220
  15. hive卡在 kill command不动假死的原因及解决方案
  16. 云服务器安装图形化界面
  17. 英语口语275之每日十句口语
  18. 【渝粤题库】陕西师范大学152205 西方行政学说史 作业(专升本)
  19. Android可拖动可吸附悬浮窗
  20. ubuntu下好用的翻译软件

热门文章

  1. Bitcoin Cash和Bitcoin Core到底谁是分叉币
  2. Spring Boot项目CentOS域名的绑定
  3. SQL开头quoted和ansiNULL
  4. Oracle 计划新的移动 OpenJDK 项目
  5. 进攻即是最好的防御!19个练习黑客技术的在线网站
  6. 菜鸟谈算法和数学对写程序的影响
  7. Silverlight 视频学习札记(一)
  8. React中的纯组件
  9. python 创建工具包_使用Python工具建立网站
  10. 为什么喜欢软件工程专业_为什么我喜欢自由软件