15

我已经读过Thread.sleep()它将暂停当前正在运行的线程指定的时间,之后它会返回可运行状态等待轮到它运行。

synchronized此外,如果从上下文调用,sleep()不会释放它持有的锁。所以我想知道它什么时候会释放锁。如果线程进入睡眠状态,则永远没有机会运行,因此它将始终与自身保持锁定,然后其他线程如何进入同步方法/块。

我不确定我是否在问有效的问题。但请帮帮我。

4

2 回答 2

22

所以我想知道它什么时候会释放锁。

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

如果线程进入睡眠状态,则永远没有机会运行,因此它将始终与自身保持锁定,然后其他线程如何进入同步方法/块。

很简单,其他线程将无法输入与休眠线程在同一对象上同步的代码。

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

于 2012-05-19T09:22:28.980 回答
20

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

于 2012-05-19T09:24:01.737 回答