推荐答案
// www.javascriptcn.com code example
using System;
using System.Threading;
class Program
{
private static readonly object _lock = new object();
private static int _sharedResource = 0;
static void Main(string[] args)
{
Thread thread1 = new Thread(IncrementResource);
Thread thread2 = new Thread(IncrementResource);
thread1.Start();
thread2.Start();
thread1.Join();
thread2.Join();
Console.WriteLine($"Final value of shared resource: {_sharedResource}");
}
static void IncrementResource()
{
for (int i = 0; i < 1000; i++)
{
Monitor.Enter(_lock);
try
{
_sharedResource++;
}
finally
{
Monitor.Exit(_lock);
}
}
}
}本题详细解读
Monitor 类的作用
Monitor 类是 C# 中用于实现线程同步的机制之一。它通过 Enter 和 Exit 方法来控制对共享资源的访问,确保在同一时间只有一个线程可以访问共享资源,从而避免竞态条件。
Monitor.Enter 和 Monitor.Exit
Monitor.Enter(object obj):尝试获取指定对象的独占锁。如果锁已被其他线程持有,当前线程将阻塞,直到锁被释放。Monitor.Exit(object obj):释放指定对象的独占锁。通常与Monitor.Enter配对使用,确保锁在操作完成后被释放。
try-finally 块的使用
在使用 Monitor 时,通常将 Monitor.Enter 和 Monitor.Exit 放在 try-finally 块中,以确保即使在发生异常的情况下,锁也能被正确释放,避免死锁。
示例代码解析
_lock是一个用于同步的对象,所有线程在访问共享资源_sharedResource之前都必须先获取这个对象的锁。IncrementResource方法中,使用Monitor.Enter和Monitor.Exit来确保对_sharedResource的访问是线程安全的。- 两个线程
thread1和thread2同时执行IncrementResource方法,但由于Monitor的同步机制,_sharedResource的最终值将是 2000,而不是不确定的值。
注意事项
Monitor是一个轻量级的同步机制,适用于简单的线程同步场景。对于更复杂的场景,可以考虑使用Mutex或Semaphore。- 使用
Monitor时,必须确保Monitor.Exit被调用,否则会导致死锁。