假设线程 1尝试使用该语句获取lockObj对象上的锁lock(lockObj)
,但在线程 1 尝试获取该对象上的锁时,该对象已被线程 2锁定。线程 1 会阻塞,对吗?
现在假设在这个阻塞期间,有一个上下文切换,因为还有其他线程和应用程序等待运行。线程 1 再次处于运行状态并能够获取锁之前的经过时间是否取决于操作系统计时器分辨率(例如:Windows 7 上的默认 15.6 毫秒)?
如果上述问题的答案是肯定的,那么我还有一个疑问:
很容易创建一个简单的程序来测试Thread.Sleep(1)
使用Stopwatch的平均开销,并得出结论它收敛到 OS 计时器分辨率(例如 15.6 毫秒)。但是我发现很难创建一个程序来为lock语句获得相同的结论。主要是因为:
1)很难保证试图获取锁的线程会一直阻塞(或者至少要在获取锁之前知道自己何时阻塞);
2)每当线程试图获取锁块时,我不知道如何强制进行上下文切换。当前运行的线程阻塞时是否总是有上下文切换?
任何帮助将不胜感激。