C#中的几种锁:用户模式锁、内核模式锁、动态计数、监视锁

C#中的几种锁:用户模式锁、内核模式锁、动态计数、监视锁

介绍几种C#中的锁,最常用的是最后的监视锁,其他的也有必要了解一下原理及应用,特别像WaitOne、WaitHandle在我们项目中应用还是挺多的。


锁:解决多线程中的数据共享安全问题。

用户模式锁

  • volatile关键字:取消release对底层的优化,在读写的时候都从内存中读取

  • SpinLock 旋转锁:

    SpinLock spinLock = new SpinLock();
    bool lockTaken = false;
    spinLock.Enter(ref lockTaken);
    spinLock.Exit();
    

内核模式锁

分为:事件锁、信号量、互斥锁、读写锁。

建议:通常不建议随便使用内核模式锁,资源付出相对较大。我们可以使用混合锁代替,以及我们马上讲到的lock关键字。

  • 事件锁(自动事件锁、手动事件锁):

    • 自动事件锁:AutoResetEvent

      AutoResetEvent myLock = new AutoResetEvent(true);//true:表示终止状态(初始状态),false表示非终止
      myLock.WaitOne();
      //...
      myLock.Set();
      
    • 手动事件锁:ManualResetEvent,和自动事件锁相比,差距在于可以对多个变量进行批量锁

      ManualResetEvent myLock = new ManualResetEvent(false);//true:可以正常通过的。false:拦截状态,禁止通过。
      
      myLock.WaitOne();//批量拦截
      //...//由于是一批,这里是无序的
      myLock.Set();
      
  • Semaphore 信号量

    • 基本原理:是通过int数值来控制线程的个数

    • Semaphore myLock = new Semaphore(5, 10);//第一个参数表示同时可以允许的线程数,第二个是最大值

    • Semaphore myLock = new Semaphore(1, 10);//每次只能一个线程通过

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值