推荐答案
-- -------------------- ---- ------- ----- ------- ----- ----------------- ----- ------- - ------- ------ -------- ------ ----- - --- --------- ------- ------ --- --------------- - -- ------ ---- ------------- ----- - ------ ------- - --- -------------------------- ------ ------- - --- -------------------------- ---------------- ---------------- --------------- --------------- ------------------------- ----- -- ------ --------- -------------------- - ------ ---- ------------------- - --- ---- - - -- - - ----- ---- - --------------------- --- - ------------------ - ------- - -------------------- - - - -
本题详细解读
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
被调用,否则会导致死锁。