如果线程在当前不拥有的锁对象上调用 Monitor.Wait(lockObj)
,则将引发 SyncronizationLockException
。
我不明白这有什么意义?如果线程确实拥有锁,因此可以成功调用 Monitor.Wait()
那么它无论如何都会立即释放锁。为什么线程不能只等待它当前不拥有的锁?
更新
我决定对我的问题添加更多解释。
据我了解,Wait 只是将当前线程放入监视器等待队列并释放锁。稍后,一个脉冲或脉冲全部将等待队列上的一个或所有线程移动到就绪队列。每当监视器被释放时,就绪队列上的下一个(如果有)线程就会获得锁定。
那么为什么 wait 不能简单地将线程添加到等待队列中呢?为什么需要获取锁才能做到这一点?这是否有物理原因,或者只是 Microsoft 设计该类来强制您以正确的方式使用它?
现在我想了一下,我猜想将某些内容放入监视器的等待队列中,或者将某些内容移动到就绪队列中,这实际上是在操纵监视器。您需要拥有显示器才能执行此操作,这是有道理的。这是正确的思考方式吗?
亏我的脑子多线程很难!
最佳答案
Monitor.Wait
的目的是让其他线程有机会获取您的锁。
如果你一开始就不拥有锁,那就没有意义;其他线程已经可以获取锁了。
(除非其他线程已经拥有该锁,在这种情况下调用 Wait
会扰乱该线程)
关于.net - 为什么在调用 Monitor.Wait() 之前必须获取监视器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4754424/