在 C# 中,线程锁是用于确保在多线程环境下对共享资源进行安全访问的机制。最常见的线程锁是通过 lock
关键字实现的。
使用 lock
关键字实现线程锁
csharp
class Example
{
private object lockObject = new object();
private int count = 0;
public void IncrementCount()
{
lock (lockObject)
{
// 这里的代码在同一时刻只能被一个线程执行
count++;
}
}
}
在这个例子中,lock (lockObject)
语句创建了一个临界区,确保只有一个线程可以同时访问由 lockObject
保护的代码块。这样就可以避免多个线程同时修改 count
变量而导致数据不一致的问题。
使用 Monitor
类实现线程锁
除了使用 lock
关键字,C# 还提供了 Monitor
类来实现线程锁。
csharp
class Example
{
private object lockObject = new object();
private int count = 0;
public void IncrementCount()
{
Monitor.Enter(lockObject);
try
{
// 这里的代码在同一时刻只能被一个线程执行
count++;
}
finally
{
Monitor.Exit(lockObject);
}
}
}
在这个例子中,Monitor.Enter
和 Monitor.Exit
方法与 lock
关键字的作用类似,都是用来确保在同一时刻只有一个线程可以访问被保护的代码块。
使用 Mutex
类实现线程锁
此外,C# 还提供了 Mutex
类,它是一种操作系统级别的线程同步原语,可以用来实现跨进程的线程同步。
csharp
class Example
{
private Mutex mutex = new Mutex();
private int count = 0;
public void IncrementCount()
{
mutex.WaitOne();
try
{
// 这里的代码在同一时刻只能被一个线程执行
count++;
}
finally
{
mutex.ReleaseMutex();
}
}
}
在这个例子中,mutex.WaitOne
和 mutex.ReleaseMutex
方法用来确保在同一时刻只有一个线程可以访问被保护的代码块。
总之,线程锁是确保多线程环境下共享资源安全访问的重要机制,C# 提供了多种方式来实现线程锁,开发者可以根据具体情况选择合适的方式来保护共享资源。