在Java中从同步上下文中调用Thread.sleep()

18

我了解到Thread.sleep()会暂停当前运行的线程,在指定的时间后,该线程将重新回到可运行状态,等待运行的机会。

另外,如果在synchronized上下文中调用sleep(),它不会释放它所持有的锁。所以我想知道它什么时候会释放锁。如果处于睡眠状态的线程永远没有机会运行,那么它将始终保留锁,并阻止其他线程进入同步块/方法。

我不确定我是否提出了一个有效的问题。但请帮忙解答一下。

2个回答

24

我想知道锁什么时候会被释放。

锁将在退出 synchronized 块时释放,而不是更早。

如果线程被置于休眠状态,永远没有机会运行,那么它将一直保留锁,那其他线程如何进入同步方法/块。

简单地说,其他线程将无法进入与睡眠线程 在相同对象上 同步的代码块。

总之,从 synchronized 块调用 Thread.sleep() 可能不是一个好主意。


5
使用Thread.sleep()可能不是一个好主意。如果你现在可以做些什么,那就立即去做。如果你必须等待某些东西才能开始做事情,那就等待那个东西而不是睡觉。 - David Schwartz
2
@DavidSchwartz:我同意。虽然Thread.sleep()有合法的用途,但它经常被滥用。 - NPE
2
讲得很清楚,但是说“总之,在同步块中调用Thread.sleep()可能不是一个好主意。”有点过分了。有时候你想要等待并保持锁定状态。 - Jesus
1
@UtenteStack 如果你在等电话响,那么你应该等电话响。你不应该睡4秒钟然后检查电话是否在你睡觉时响了。如果有什么事情你在等待,你应该等待那件事情而不是睡觉。 - David Schwartz
1
允许调用API的代码应使用定时器触发对“notify”的调用。进行API调用的代码应使用“wait”等待许可。即使将这两个函数合并为一段代码,操作也将由计时器触发,因此无需调用“sleep”。与其让线程等待某些事情发生以便它可以执行工作,不如让正在发生的事情导致工作完成,这样就不需要等待任何东西。 - David Schwartz
显示剩余2条评论

20
如果你使用 Object.wait 而不是 Thread.sleep,则来自 synchronized 块的锁将被释放。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接