企业网站的用户需求分析,做杂志的网站,西安公司网站建设服务商,专门做优惠券的网站一. 监视锁(Monitor和lock)
1. Monitor类#xff0c;限定线程个数的一把锁#xff08;Synchronized lock是他的语法糖#xff09;#xff0c;两个核心方法#xff1a; Enter#xff1a;锁住某个资源。 Exit#xff1a;退出某一个资源。
测试案例#xff1a;开启5个线…一. 监视锁(Monitor和lock)
1. Monitor类限定线程个数的一把锁Synchronized lock是他的语法糖两个核心方法 Enter锁住某个资源。 Exit退出某一个资源。
测试案例开启5个线程同时对一个变量进行自增操作结果变量有序的输出说明该锁同时只允许一个线程访问。
但是写法很麻烦每次都要try-catch-finally还要声明bool变量。这个时候lock语法糖就很好的解决了这个问题。 代码实践 1 static object lockMe new object();2 {3 for (int i 0; i 5; i)4 {5 Task.Factory.StartNew(() 6 {7 for (int j 0; j 100; j)8 {9 var b false;
10 try
11 {
12 Monitor.Enter(lockMe, ref b);
13 Console.WriteLine(num);
14 }
15 catch (Exception)
16 {
17
18 throw;
19 }
20 finally
21 {
22 if (b)
23 {
24 Monitor.Exit(lockMe);
25 }
26 }
27
28 }
29
30 });
31 }
32 } 2. lock语法糖 使用很简单声明一个静态的object类型变量调用lock语法糖将共享变量放入其中即可保证lock内同时只能一个线程访问。 代码实践 1 {2 for (int i 0; i 5; i)3 {4 Task.Factory.StartNew(() 5 {6 for (int j 0; j 100; j)7 {8 lock (lockMe)9 {
10 Console.WriteLine(num);
11 }
12 }
13 });
14 }
15 } 二. 混合锁
1. 简介混合锁用户模式锁内核模式锁先在用户模式下内旋如果超过一定的阈值会切换到内核锁在内旋模式下我们会看到大量的Sleep(0),Sleep(1),Yield等语法。 Thread.Sleep(1) 让线程休眠1ms Thread.Sleep(0) 让线程放弃当前的时间片让本线程更高或者同等线程得到时间片运行。 Thread.Yield() 让线程立即放弃当前的时间片可以让更低级别的线程得到运行当其他thread时间片用完本thread再度唤醒。 混合锁包括以下三种ManualResetEventSlim、SemaphoreSlim、ReaderWriterLockSlim,这三种混合锁要比他们对应的内核模式锁 (ManualResetEvent、Semaphore、ReaderWriterLock),的性能高的多。
2. ManualResetEventSlim 构造函数默认为false可以使用Wait方法替代WaitOne方法支持任务取消. (详细的代码同内核版本类似这里不做测试了)
3. SemaphoreSlim 用法和内核版本类似使用Wait方法代替WaitOne方法Release方法不变。(详细的代码同内核版本类似这里不做测试了)
4. ReaderWriterLockSlim 用法和内核版本类似但是四个核心方法换成了 锁读的两个核心方法EnterReadLock、ExitReadLock。 锁写的两个核心方法EnterWriteLock、ExitWriteLock。 (详细的代码同内核版本类似这里不做测试了)