java – 无法获取锁定的Thread会发生什么?

线程无法获得锁定(非旋转)会发生什么?它进入BLOCKED状态.它是如何再次执行的?

Lock lck = new ReentrantLock();
lck.lock()
try
{
}
finally
{
   lck.unlock();
}

解决方法:

调度程序(或底层的Lock实现)负责使其再次运行.如果锁定操作被转换为内核中的互斥锁调用,则调度程序将不会重新调度该线程,直到互斥锁变为可用为止;那么OS调度程序将重新唤醒线程.阅读Context Switch上的*页面以及其中的链接可能会提供有关所涉及的详细机制的更多信息.您也可以直接查看ReentrantLock的代码,但最终会将您的问题归结为原语的某些组合,包括AbstractedQueuedSynchronizer,各种原子操作,以及LockSupport.park()和unpark().如果您对内核级别的阻塞/上下文切换特别感兴趣,或者特别是如何在内核上实现各种Java原语(例如,j.u.c.Lock或原始对象监视器),则可以增加您的问题或者询问新问题.

在实践中,因为这是昂贵的,所以可以通过JVM或锁实现来优化它.例如,线程实际上可能会旋转一下,看看在实际阻塞之前是否释放了锁.

请注意,即使底层OS线程未被阻止,Java线程也可以报告状态BLOCKED,特别是在下面的性能白皮书中描述的自适应旋转情况中.

有一些很好的资源可以学习Java中的并发控制.领导万神殿是Java Concurrency in Practice. HotSpot 6.0 in the Java SE 6 Performance Whitepaperrelated slides同步表演的一些有趣的讨论.

上一篇:mysql – 删除行会导致锁定超时


下一篇:Android锁屏