java - 在Java中,在当前线程被调用sleep()后,其他线程如何有机会运行但仍然持有锁?

标签 java multithreading concurrency sleep

在Java中,线程可以进入休眠状态,这样它就不会占用进程,并且其他线程可以有机会运行。这是通过调用 sleep() 来完成的。

但是,与调用 wait() 不同,线程在调用 sleep() 之后,将不会释放它一直持有的锁。既然这个线程仍然持有锁,那么其他线程如何在无法获得未释放的锁的情况下有机会运行?

最佳答案

他们不能;其他需要获取 sleep 线程持有的锁的线程将阻塞,直到它们能够获取该锁。没有办法像在显式锁上尝试获取那样后退,因此线程被卡住。

线程在持有锁时不应 hibernate 。如果一个线程没有做一些有用的事情,它就不需要持有锁。

要进入 hibernate 状态并释放锁,请使用 wait 方法。除了中断(应该用于取消)之外,Sleep 没有任何方法可以缩短其 sleep 时间,wait 让线程得到通知。

关于java - 在Java中,在当前线程被调用sleep()后,其他线程如何有机会运行但仍然持有锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45622320/

相关文章:

multithreading - forkOn 和 -qm RTS 标志之间有什么关系?

java - Spring:ModelAndView无法找到 View

java - 如何在 OSX 上的 Java 7 中使用 32 位 native 库

java - 如何正确将 "layout"打成JLabel?

java - 同步访问相同文件、并发访问不同文件

multithreading - 可重入锁 : pros and cons?

C# 图像,对象在其他地方使用错误

django - 在Django中锁定对象的最简单方法是什么

java - 为什么 ormlite 有自己的注释?

linux - 如何执行具有并发和等待限制的多个命令?