当前位置: 首页 > news >正文

浅谈C#之线程锁

一、基本介绍

        线程锁通常指的是lock关键字,它用于确保当一个线程位于代码的临界区时,其他线程不进入该区。lock通常用于保护共享资源,避免竞争条件。

二、关键点

锁(Lock)lock关键字是C#中用于实现线程同步的最常用方法。它确保一个线程在执行代码块时,其他线程不能进入这个代码块。

private readonly object _lockObject = new object();public void SomeMethod()
{lock (_lockObject){// 受保护的代码}
}

MonitorMonitor类提供了更灵活的锁定机制。它允许尝试进入锁定状态(TryEnter),设置超时(Wait),以及在不需要时释放锁(PulseExit)。

private readonly object _lockObject = new object();public void SomeMethod()
{Monitor.Enter(_lockObject);try{// 受保护的代码}finally{Monitor.Exit(_lockObject);}
}

MutexMutex是一种跨进程的同步机制,它允许不同进程间的线程同步。在C#中,Mutex类提供了这种功能。

using System.Threading;Mutex mutex = new Mutex();public void SomeMethod()
{mutex.WaitOne();try{// 受保护的代码}finally{mutex.ReleaseMutex();}
}

SemaphoreSemaphore是一个计数信号量,它允许多个线程同时访问资源,但是限制了同时访问的最大线程数。

using System.Threading;Semaphore semaphore = new Semaphore(3, 3);public void SomeMethod()
{semaphore.WaitOne();try{// 受保护的代码}finally{semaphore.Release();}
}

ReaderWriterLockSlim:这是一种更轻量级的锁,专为读多写少的场景设计。它允许多个读操作并行执行,但写操作是独占的。

using System.Threading;ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();public void ReadMethod()
{rwLock.EnterReadLock();try{// 读取操作}finally{rwLock.ExitReadLock();}
}public void WriteMethod()
{rwLock.EnterWriteLock();try{// 写入操作}finally{rwLock.ExitWriteLock();}
}

AsyncLock:在异步编程中,传统的锁机制可能不适用,因为它们不支持异步等待。AsyncLock是一个异步锁,它允许异步方法在等待锁时释放线程。

using System.Threading.Tasks;
using System.Threading;public class AsyncLock
{private readonly object _lockObject = new object();private readonly Task<Releaser> _releaserTask = Task.FromResult(new Releaser(null));public async Task EnterAsync(){var releaser = await _releaserTask;lock (_lockObject){releaser = await _releaserTask.ConfigureAwait(false);}await releaser.DisposeAsync();}private class Releaser : IDisposable{private readonly TaskCompletionSource<bool> _tcs = new TaskCompletionSource<bool>();public Releaser(TaskCompletionSource<bool> tcs){_tcs = tcs;}public async Task DisposeAsync(){lock (_lockObject){_releaserTask = _tcs.Task;}_tcs.TrySetResult(true);}}
}

三、注意事项

  • 避免死锁:确保在代码中不会有两个或更多的线程相互等待对方释放锁。
  • 避免资源争用:尽量减少锁的持有时间,以减少线程等待时间。
  • 考虑性能:不同的锁机制有不同的性能特性,选择合适的锁机制可以提高程序性能。


http://www.mrgr.cn/news/22554.html

相关文章:

  • 【C语言】快速排序——动图演示
  • Matlab simulink建模与仿真 第十一章(端口及子系统库)【上】
  • JAVA智听未来一站式有声阅读平台听书系统小程序源码
  • 0.91/ 0.96寸等OLED芯片SSD1306 十分有趣的使用方法
  • CLine Action Editor 动画技能编辑器游戏工具
  • 【30天玩转python】字典与集合
  • k8s--资源管理
  • windows手工杀毒-寻找可疑进程之内存
  • 1986-2015年 中国城镇住户调查微观数据UHS
  • Oracle(114)什么是增量备份(Incremental Backup)?
  • C++如何设计函数多返回值以及如何加速输入输出效率
  • TensorFlow
  • 无人机专业大学,除了理论还必须会组装、调试、硬件才更好就业
  • 【数据结构】排序算法系列——选择排序(附源码+图解)
  • 华为OD机试真题 - 考古学家 - 递归(Python/JS/C/C++ 2024 D卷 200分)
  • Exchange 服务器存档配额配置方法及注意事项
  • 手撕Python之生成器、装饰器、异常
  • Linux压缩、解压缩、查看压缩内容详解使用(tar、gzip、bzip2、xz、jar、war、aar)
  • Python知识点:如何使用Python进行Excel文件操作(OpenPyXL、Pandas)
  • 【文档规范】嵌入式软件代码开发测试文档