在.NET中,假设thread A
锁定一个对象。同时,thread B
和thread C
被屏蔽,并等待thread A
解锁对象。
现在,thread A
解锁了该对象。接下来会选择哪个线程(B或C)?怎么决定?
答案 0 :(得分:5)
简短的回答是它是非确定性的 - 即你永远不会知道。
中等答案是,等待获取锁的线程被放入“就绪队列”,即FIFO,但你不能依赖它。
很长的答案是,就绪队列中的线程可以“借用”来运行称为APC的小块工作(Asynchronous Procedure Calls
)当发生这种情况时,它们会在队列中失去位置并且当APC完成时,他们被放回准备好的队列 - 但最后。
所以,回到简短的回答:你永远不会知道。
答案 1 :(得分:2)
应该是第一个尝试获取锁定的人(如队列),See more here