Java 无法获取锁的线程会发生什么情况?

Java 无法获取锁的线程会发生什么情况?,java,locking,monitor,blocking,Java,Locking,Monitor,Blocking,无法获取锁(非旋转)的线程会发生什么情况?它进入阻塞状态。它是如何再次执行的 Lock lck = new ReentrantLock(); lck.lock() try { } finally { lck.unlock(); } 调度器(或底层锁实现)负责使其重新运行。如果锁操作一直被转换为一个互斥调用到内核中,调度程序将不会重新调度线程,直到互斥变为可用;然后,操作系统调度程序将重新唤醒线程。阅读上面的维基百科页面和其中的链接可能会提供更多有关详细机制的见解。您还可以直接查看代码,尽

无法获取锁(非旋转)的线程会发生什么情况?它进入阻塞状态。它是如何再次执行的

Lock lck = new ReentrantLock();
lck.lock()
try
{
}
finally
{
   lck.unlock();
}
调度器(或底层锁实现)负责使其重新运行。如果锁操作一直被转换为一个互斥调用到内核中,调度程序将不会重新调度线程,直到互斥变为可用;然后,操作系统调度程序将重新唤醒线程。阅读上面的维基百科页面和其中的链接可能会提供更多有关详细机制的见解。您还可以直接查看代码,尽管这最终会将您的问题归结为一些原语的组合,包括
AbstractedQueuedSynchronizer
、各种原子操作,可能还有
unpark()
。如果您对内核级阻塞/上下文切换特别感兴趣,或者特别感兴趣的是各种Java原语(例如,
j.u.c.Lock
或原语对象监视器)是如何在内核上实现的,那么您可以补充您的问题或问一个新问题

在实践中,由于成本高昂,这可能会被JVM或锁实现优化掉。例如,线程实际上可能会旋转一段时间,以查看在实际阻塞之前是否释放了锁

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


有一些很棒的资源可以学习Java中的并发控制。领导万神殿的是。一些关于中同步性能的有趣讨论,以及一些

持有锁的线程解锁锁,然后(或“a”)阻塞的线程被唤醒。如果持有锁的线程从未释放锁(可能是因为它在另一个资源上被阻塞),那么就会出现死锁。非旋转锁通常会使用wait()/notify()原语或类似的东西,以便在锁再次可用时通知线程。

锁获取永远不会失败。把它想象成尚未成功


当然,在某些情况下,它永远不会成功,但在没有转换事件的情况下,线程会收到失败通知…它只是一直等待。

锁获取确实失败!当您的应用程序死锁并强制终止进程时!;-)不,你只是没有给它一个机会。最终,在几十亿年后,一些量子涨落将翻转正确的位,其中一个线程将放弃其锁。该死的,我应该将其写入我的下一个国防部性能规范。。。量子力学是最终的解决方案。