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();
  • 相关阅读:
    html5与css交互 API 《一》classList
    HTML5标签速查
    html5中常被忘记的标签,属性
    html5不熟悉的标签全称
    基于HTML5的网络拓扑图(1)
    HTML5 Canvas绘制效率如何?
    前端性能优化(Application Cache篇)
    Android独立于Activity或者Fragment的LoadingDialog的实现
    android常用设计模式的理解
    android使用android:ellipsize="end"无效的解决方法
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15192304.html
Copyright © 2011-2022 走看看