C#如何使用Lock
C#如何使用Lock
在C#中,lock 关键字用于确保当一个线程位于代码的临界区时,其他线程不进入相同的代码区。
lock 关键字是通过在对象上获取互斥锁来实现的。在C#中,每个对象都有一个与之关联的互斥锁。当你在对象上放置一个lock 时,这就指示当前线程获取该对象的互斥锁,而其他任何线程都不能获取同一个对象的锁,直至当前线程释放该锁。
以下是使用 lock 的基本语法:
object lockObject = new object();
lock(lockObject)
{
// 临界区代码
}
在上述代码中,lockObject 是用于同步的对象,它可以是任何非null对象。在 lock 块内的代码被称为临界区,在这个区域内,当前线程将保持互斥锁,直到它退出区域。
以下是一个使用 lock 的示例,其中两个线程同时对一个共享资源进行读写操作:
using System;
using System.Threading;
class Program
{
static int resource = 0;
static object lockObject = new object();
static void Main()
{
Thread thread1 = new Thread(new ThreadStart(IncrementResource));
Thread thread2 = new Thread(new ThreadStart(DecrementResource));
thread1.Start();
thread2.Start();
thread1.Join();
thread2.Join();
Console.WriteLine($"Resource: {resource}");
}
static void IncrementResource()
{
for (int i = 0; i < 1000; i++)
{
lock (lockObject)
{
resource++;
}
}
}
static void DecrementResource()
{
for (int i = 0; i < 1000; i++)
{
lock (lockObject)
{
resource--;
}
}
}
}
在这个例子中,我们有一个共享资源 resource,两个线程 thread1 和 thread2 分别对它进行增加和减少操作。使用 lock 确保了每次操作都对 resource 的状态产生原子性的效果。
注意:
始终锁定一个独特的对象(不是this),以避免死锁。
避免在锁内部执行长时间运行的操作,以减少锁定的持续时间。
使用 try...finally 块来确保释放锁,即使在临界区中发生异常也是如此。