internal sealed class SimpleHybridLock : IDisposable
{
//基元用户模式构造使用
private int m_waiters = ; //基元内核模式构造
private AutoResetEvent m_waiterLock = new AutoResetEvent(false); public void Enter()
{
//指出该线程想要获得锁
if (Equals(Interlocked.Increment(ref m_waiters), ))
{
//无竞争,直接返回
return;
} //另一个线程拥有锁(发生竞争),使这个线程等待
//线程会阻塞,但不会在CPU上“自旋”,从而节省CPU
//这里产生较大的性能影响(用户模式与内核模式之间转换)
//待WaitOne返回后,这个线程拿到锁
m_waiterLock.WaitOne();
} public void Leave()
{
//该线程准备释放锁
if (Equals(Interlocked.Decrement(ref m_waiters), ))
{
//无线程等待,直接返回
return;
} //有线程等待则唤醒其中一个
//这里产生较大的性能影响(用户模式与内核模式之间转换)
m_waiterLock.Set();
} public void Dispose()
{
m_waiterLock.Dispose();
}
}

简单混合锁(HybridLock)的更多相关文章

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

    一. 监视锁(Monitor和lock) 1. Monitor类,限定线程个数的一把锁,两个核心方法: Enter:锁住某个资源. Exit:退出某一个资源. 测试案例:开启5个线程同时对一个变量进行 ...

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

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

  3. C# lock的语法糖原理--《.net core 底层入门》之自旋锁,互斥锁,混合锁,读写锁

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

  4. iOS开发——使用技术OC篇&简单九宫格锁屏功能的实现与封装

    简单九宫格锁屏功能的实现与封装 首先来看看最后的实现界面. 在这开始看下面的内容之前希望你能先大概思考活着回顾一下如果 你会怎么做,只要知道大概的思路就可以. 由于iphone5指纹解锁的实现是的这个 ...

  5. MyBatis Generator 生成的example 使用 and or 简单混合查询

    MyBatis Generator 生成的example 使用 and or 简单混合查询 参考博客:https://www.cnblogs.com/kangping/p/6001519.html 简 ...

  6. 【Redis 分布式锁】(1)一把简单的“锁”

    原文链接:https://www.changxuan.top/?p=1230 在单体架构向分布式集群架构演进的过程中,项目中必不可少的一个功能组件就是分布式锁.在开发团队有技术积累的情况下,做为团队的 ...

  7. 一文带你.Net混合锁和lock语句

    本文主要讲解.Net基于Monitor.Enter和lock实现互斥锁 Monitor.Enter实现 相比前面的锁来说,混合锁的性能更高,任何引用类型的对象都可以做为锁对象,不需要事先创建指定类型的 ...

  8. 基于Redis的简单分布式锁的原理

    参考资料:https://redis.io/commands/setnx 加锁是为了解决多线程的资源共享问题.Java中,单机环境的锁可以用synchronized和Lock,其他语言也都应该有自己的 ...

  9. 使用Redis模拟简单分布式锁,解决单点故障的问题

    需求描述: 最近做一个项目,项目中有一个功能,每天定时(凌晨1点)从数据库中获取需要爬虫的URL,并发送到对应的队列中,然后客户端监听对应的队列,然后执行任务.如果同时部署多个定时任务节点的话,每个节 ...

随机推荐

  1. 论文阅读及复现 | Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks

    两种形式的LSTM变体 Child-Sum Tree-LSTMs N-ary Tree-LSTMs https://paperswithcode.com/paper/improved-semantic ...

  2. Lua开发环境

    下载并解压Lua源码: wget http://www.lua.org/ftp/lua-5.1.5.tar.gz tar zxvf lua-5.1.5.tar.gz cd lua-5.1.5 打开Ma ...

  3. airflow迁移

    airflow迁移:airflow.cfg文件可以copydbinit时改数据参数 #airflow震乾源码copy:/data/venv/lib/python3.6/site-packages/ai ...

  4. [转帖]快速部署Telegraf & Influxdb

    快速部署Telegraf & Influxdb https://www.cnblogs.com/deykenlee/p/7565647.html 作者的blog 比较早 后来 influxdb ...

  5. 【Python】【demo实验5】【练习实例】【多个数字组合成不重复三位数】

    题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 程序源代码 ...

  6. windows ping命令

    ping -a 192.168.xxx.xxx  解析计算机NetBios名 ping -n 数字 192.168.xxx.xxx  发送指定数量的echo数据包数,默认是四个 ping -l 192 ...

  7. SQLite进阶-9.别名

    我们可以暂时给表或者列重命名为另一个名字,称为别名,重命名只是临时运行时改变,不会改变数据库中的实际的名字. -- 语法 SELECT column_name AS column_alias_name ...

  8. LEN()和DATALENGTH()的区别

    原文:LEN()和DATALENGTH()的区别 版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.n ...

  9. 七牛云图床及MPIC工具使用

    考虑到图片更容易被人接受,但是大量图片又会延迟博客加载速度.因此,个人感觉可以把静态文件资源托管在云端,这样加载的话就不至于太慢. 注册七牛云 实名验证通过 创建文件存储 内容管理-上传图片 下载Mp ...

  10. Servlet简单例子

    一.项目结构 二.index.jsp <%@ page contentType="text/html; charset=utf-8" %> <html> & ...