zoukankan      html  css  js  c++  java
  • C#中的几种锁:用户模式锁、内核模式锁、动态计数、监视锁

    参考网址: https://blog.csdn.net/weixin_43989331/article/details/105356008

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

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

    锁:解决多线程中的数据共享安全问题。
    用户模式锁
    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);//每次只能一个线程通过

    Semaphore myLock = new Semaphore(1, 10);

    myLock.WaitOne();
    //...
    myLock.Release();

    • Mutex互斥锁

      可用于非全局变量互斥的情况,如同一ID的用户只允许提交一次抽奖请求。

    Mutex mutex = new Mutex();
    
    mutex.WaitOne();
    //...
    mutex.ReleaseMutex();
  • 相关阅读:
    DataSet & DataTable &DataRow 深入浅出(转)
    使用三种方式搭建IIS web 网站
    淘宝系App图片为什么在北京电信网络加载这么慢?
    面向新手的Web服务器搭建(一)——IIS的搭建
    Ajax请求中的async:false/true的作用
    .net SerialPort
    .net常用属性
    Active Directory 常用属性
    .net加密
    MongoDb
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15192304.html
Copyright © 2011-2022 走看看