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);//每次只能一个线程通过
-