lock是C#基于Monitor.Enter/Exit的语法糖,需用private readonly object字段作锁对象,避免用this、字符串等;不支持异步,高并发下应优先考虑Interlocked、Concurrent集合或AsyncLock。

lock 是 C# 中最常用、最简洁的线程同步机制,本质是基于 Monitor.Enter 和 Monitor.Exit 的语法糖,用于确保同一时刻只有一个线程能进入被保护的代码块。
必须用一个**引用类型对象**(通常为 private readonly object 字段)作为锁对象,不能用值类型或字符串字面量,否则会因装箱/字符串驻留导致意外共享锁。
private readonly object _lockObj = new object();
<p>public void DoWork()
{
lock (_lockObj)
{
// 这里是临界区,同一时间仅一个线程可执行
SharedCounter++;
}
}lock 编译后等价于 try-finally 中调用 Monitor.Enter/Exit,确保即使发生异常也能释放锁:
lock (obj) { ... }
// 等价于:
Monitor.Enter(obj);
try
{
...
}
finally
{
Monitor.Exit(obj);
}Monitor.TryEnter(obj, timeout))、条件等待(Monitor.Wait/Pulse)等高级操作,lock 不直接支持这些SemaphoreSlim、AsyncLock(.NET 6+)lock 虽简单,但不是万能解。高并发场景下过度使用会严重降低吞吐量。
Interlocked.Increment(ref counter)
AsyncLock(如 Microsoft.Threading.Tasks.Extensions)或 SemaphoreSlim.WaitAsync()
锁本身开销很小,但争用(多个线程频繁抢同一把锁)会导致线程挂起/唤醒,大幅拖慢性能。
ConcurrentDictionary 内部实现)基本上就这些。lock 用对了很安全,用错了容易埋坑。关键是选对锁对象、控制好范围、别在锁里干重活。
以上就是C#怎么使用lock关键字 C#线程同步锁的使用方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号