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();
原文地址:https://www.cnblogs.com/bruce1992/p/15192304.html