为什么在java中yield方法不释放锁?

时间:2014-04-30 12:24:25

标签: java multithreading

我对java中的yield方法有一些疑问。因为当我们像Thread.yield()一样使用它时,线程进入runnable状态并给另一个线程运行的机会,但是调用yield的线程没有释放锁。因此,只有那些等待锁定释放的线程才会运行。因此,何时以及在何种情况下这种收益率方法是有用的。

2 个答案:

答案 0 :(得分:4)

Thread.yield()在提供合作而非先发制人线程的环境中非常有用。换句话说,如果操作系统不会暂停你的线程让另一个运行。在这样的环境中,执行CPU密集型操作时应定期调用yield()

我不知道任何支持Java但不支持抢占式线程的现代操作系统,因此它在现代Java程序中几乎没有用处。

Thread.yield() 没有与锁有关,没有记录以任何方式影响锁,并且不应该假设它会释放锁。


编辑:this SO answer提供了有关Thread.yield()如何实施的更多信息(至少与JDK 1.6相同)。

答案 1 :(得分:1)

我同意@kdgregory,Thread.yield()可能不应该在现代Java程序中使用。但是,这不是因为允许一个线程屈服于其他线程是一个坏主意:它只是因为,如果你真的需要yield(),那么你可能正在重新发明一个已经算法的算法在java.util.concurrent中实现。


有一件事是肯定的:如果您打算屈服(),不要在同步区域内完成。 yield()的重点是让其他线程运行。同步块的重点是"我想在任何其他线程启动它之前完成这一点。"

您的目标始终应该是确保您的程序尽可能少花时间在同步块中。它在同步块中花费的时间越多,从多个处理器中受益的就越少。每个同步块都是瓶颈。即使是小的也可以产生很大的不同。阅读有关阿姆达尔法律的内容。