可能重复:
.NET 中的锁定(监视器)内部实现
我想知道 Monitor.Enter() 方法是如何工作的?我知道在堆上分配的每个对象都有与之关联的同步块结构。SyncBlock 结构包含 Monitor、Hashcode、AppDomainID 的字段,以及用于与 com/非托管代码互操作的 thunking 数据。CLR 如何处理多个锁请求?如果一个线程持有锁(可能是通过增加 SyncBlock 数据结构的 Monitor 字段的值),其他线程将进入 WaitSleepJoin 状态。CLR 如何处理处于这种状态的线程,以便一旦释放锁,只有一个线程将恢复,而其他线程将继续等待锁?CLR 是否创建任何 WaitHandle 对象并让线程等待 WaitHandle 对象?