lock关键字通过monitor类实现排他锁,确保多线程下共享资源访问的线程安全;2. 使用私有只读object字段作为锁对象是最佳实践,避免锁定this、typeof、字符串字面量或值类型以防死锁或同步失效;3. lock不支持超时、无公平性保证、无法控制并发数且不区分读写,复杂场景应选用semaphoreslim或readerwriterlockslim。

C#中的
lock
lock
lock
Monitor
lock (someObject)
Monitor.Enter
Monitor.Exit
Monitor.Exit
try-finally
这个
someObject
lock
someObject
try
finally
lock
深入一点看,
lock
System.Threading.Monitor
lock (myLockObject)
bool lockTaken = false;
try
{
Monitor.Enter(myLockObject, ref lockTaken);
// 这里是你的临界区代码
}
finally
{
if (lockTaken)
{
Monitor.Exit(myLockObject);
}
}这里需要注意
Monitor.Enter
bool lockTaken
Monitor.Enter
true
lockTaken
false
Monitor.Exit
Monitor
Monitor.Enter
Monitor.Exit
Monitor
Monitor
lock
Monitor
lock
选择一个合适的锁对象至关重要,否则可能导致意想不到的死锁、性能瓶颈,甚至无法达到同步的目的。
常见陷阱:
锁定this
public class MyClass
{
public void DoSomething()
{
lock (this) // 陷阱!
{
// ...
}
}
}当你锁定
this
MyClass
MyClass
锁定typeof(MyClass)
public class MyClass
{
public static void DoSomethingStatic()
{
lock (typeof(MyClass)) // 陷阱!
{
// ...
}
}
}锁定
typeof(MyClass)
MyClass
Type
Type
typeof(MyClass)
锁定字符串字面量:
public void DoSomething()
{
lock ("myLockString") // 陷阱!
{
// ...
}
}C#编译器会对字符串字面量进行“字符串驻留”(string interning)。这意味着,即使你在代码的不同地方写了相同的字符串字面量,它们在内存中可能指向同一个唯一的字符串对象。因此,锁定一个字符串字面量可能无意中导致你的锁与应用程序中其他看似不相关的代码共享同一个锁对象,造成难以调试的竞争条件。
锁定值类型:
int counter = 0;
private void Increment()
{
lock (counter) // 陷阱!
{
counter++;
}
}lock
lock
lock
最佳实践:
使用私有的、只读的object
public class MyClass
{
private readonly object _lockObject = new object(); // 最佳实践!
public void DoSomething()
{
lock (_lockObject)
{
// 临界区代码
}
}
}对于实例方法,创建一个
private readonly object
private
readonly
对于静态方法或静态成员,使用私有的、只读的静态object
public class MyClass
{
private static readonly object _staticLockObject = new object(); // 最佳实践!
public static void DoSomethingStatic()
{
lock (_staticLockObject)
{
// 临界区代码
}
}
}这确保了对静态成员的访问同步,并且同样遵循了封装性原则。
保持锁的粒度尽可能小: 只锁定真正需要同步的代码块,而不是整个方法或类。过大的锁粒度会限制并发性,导致性能下降。例如,如果一个方法中只有一小部分涉及到共享资源,那么只对这部分代码使用
lock
lock
SemaphoreSlim
ReaderWriterLockSlim
lock
独占性:
lock
lock
无超时机制:使用
lock
Monitor.TryEnter
lock
无公平性保证:
lock
Monitor
无法控制并发数量:
lock
SemaphoreSlim
SemaphoreSlim
无法区分读写操作:对于读多写少的场景,
ReaderWriterLockSlim
lock
总的来说,
lock
SemaphoreSlim
ReaderWriterLockSlim
以上就是C#的lock关键字如何实现线程同步?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号