C#中锁的使用分类
1 互斥锁lock(基于Monitor实现)
定义:
private static readonly object Lock = new object();
使用:
lock (Lock)
{
//todo
}
作用:将会锁住代码块的内容,并阻止其他线程进入该代码块,直到该代码块运行完成,释放该锁。
注意:定义的锁对象应该是 私有的,静态的,只读的,引用类型的对象,这样可以防止外部改变锁对象
2 互斥锁Monitor
定义:
private static readonly object Lock = new object();
使用:
Monitor.Enter(Lock);
//todo
Monitor.Exit(Lock);
作用:将会锁住代码块的内容,并阻止其他线程进入该代码块,直到该代码块运行完成,释放该锁。
注意:定义的锁对象应该是 私有的,静态的,只读的,引用类型的对象,这样可以防止外部改变锁对象
Monitor有TryEnter的功能,可以防止出现死锁的问题,lock没有
3 互斥锁Mutex
定义:
private static readonly Mutex mutex = new Mutex();
使用:
mutex.WaitOne();
//todo
mutex.ReleaseMutex();
作用:将会锁住代码块的内容,并阻止其他线程进入该代码块,直到该代码块运行完成,释放该锁。
注意:定义的锁对象应该是 私有的,静态的,只读的,引用类型的对象,这样可以防止外部改变锁对象
Mutex本身是可以系统级别的,所以是可以跨越进程的
4 读写锁ReaderWriterLockSlim
定义:
private static readonly ReaderWriterLockSlim LockSlim = new ReaderWriterLockSlim();
使用:
写锁
try
{
LockSlim.EnterWriteLock();
//todo
}
catch (Exception ex)
{
}
finally
{
LockSlim.ExitWriteLock();
}
读锁
try
{
LockSlim.EnterReadLock();
}
catch (Exception ex)
{
}
finally
{
LockSlim.ExitReadLock();
}
基本规则: 读读不互斥 读写互斥 写写互斥
作用:当同一个资源被多个线程读,少个线程写的时候,使用读写锁
引用:https://blog.csdn.net/weixin_40839342/article/details/81189596
问题: 既然读读不互斥,为何还要加读锁
答: 如果只是读,是不需要加锁的,加锁本身就有性能上的损耗
如果读可以不是最新数据,也不需要加锁
如果读必须是最新数据,必须加读写锁
读写锁相较于互斥锁的优点仅仅是允许读读的并发,除此之外并无其他。
1
2
3
4
5
注意:不要使用ReaderWriterLock,该类有问题
转载于:https://www.cnblogs.com/yaosj/p/10343185.html
————————————————
版权声明:本文为CSDN博主「路遥执码力」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40719943/article/details/107272576
相关文章
- C#winForm窗体美化
- C#之ArcGIS二次开发
- c# mysql executenonquery_C#与数据库访问技术之ExecuteNonQuery方法
- C# 条件运算符_c++ 运算符
- C# 语言程序设计笔记
- c#面试题抽象类和接口的区别-金三银四面试:C#程序员经常遇到的30道基础面试题,想你所想
- C# WPF DataGrid下面 使用CheckBox 选中事件
- C 快速操作 Oracle实现快速数据插入(c# 插入 oracle)
- C#IFF图形结构解析代码
- C#中的Equals、RefrenceEquals和==的区别与联系
- C#几种截取字符串的方法小结
- 深入解析c#中枚举类型的定义与使用
- C#正则表达式分解和转换IP地址实例(C#正则表达式大全c#正则表达式语法)
- 解析C#中[],List,Array,ArrayList的区别及应用
- C#中利用代理实现观察者设计模式详解
- C#异常处理的一些经验和技巧
- c#连接mysql数据库的方法
- C#遍历DataSet控件实例总结
- C#特性-迭代器(上)及一些研究过程中的副产品
- C#中csv文件与DataTable互相导入处理实例解析