Java 线程的等待和睡眠方法的混淆

Java 线程的等待和睡眠方法的混淆,java,multithreading,Java,Multithreading,睡眠能保持锁,但等待不能 我对wait的想法是,它释放锁,让其他线程有机会在等待时获取该线程上的监视器 但对睡眠有疑问的是,为什么线程在睡眠时会保持锁定,因为睡眠后线程总是进入可运行状态。睡眠与锁定无关 持有锁时需要调用Object.wait,因为需要在持有锁的同时执行停止等待的条件测试,以便对条件有一致的视图。但通常情况下,睡觉时一根线并没有锁住锁 拿着锁睡觉似乎是非常糟糕的行为。但是如果你需要多个锁,在你获得一个锁的时候,你必须在尝试获得另一个锁之前退出,那么在持有锁的时候睡觉可能是有意义的

睡眠能保持锁,但等待不能

我对wait的想法是,它释放锁,让其他线程有机会在等待时获取该线程上的监视器


但对睡眠有疑问的是,为什么线程在睡眠时会保持锁定,因为睡眠后线程总是进入可运行状态。睡眠与锁定无关

持有锁时需要调用Object.wait,因为需要在持有锁的同时执行停止等待的条件测试,以便对条件有一致的视图。但通常情况下,睡觉时一根线并没有锁住锁

拿着锁睡觉似乎是非常糟糕的行为。但是如果你需要多个锁,在你获得一个锁的时候,你必须在尝试获得另一个锁之前退出,那么在持有锁的时候睡觉可能是有意义的。如果调用睡眠释放锁,这种后退策略将不起作用


让Thread.sleep不受锁的影响可以使API变得更简单,并通过不完全排除需要持有锁的线程使用它来为程序员提供更多的选择。

为什么线程在睡眠时保持锁,因为它总是在睡眠后进入可运行状态

考虑以下场景:-

private Object objLock = new Object();

public void myMethod() {
   .... 
   synchronized(objLock) {

      Thread.sleep(1000);   // make the current running thread sleep for 1 second only. 
      ... // Code here which needs to be executed immediately after 1 second sleep time
   }
   ....
}
如果在上面的代码中调用sleep时JVM释放了锁,那么当它返回到可运行状态时,执行的恢复将取决于调度以及根据JLS执行线程的处理器的可用性。如果另一个线程偶然获得了锁,那么程序可能根本不会恢复,这将导致程序失败行为不一致。这可能是它不释放任何锁的原因之一。

Q:Thread.sleepn做什么? A:没什么。完全没有

问:需要多长时间? 答:如果线程没有中断,至少需要n毫秒


关于线程,您不需要了解太多其他内容。睡眠。

不清楚理解这一行,它让线程在不持有锁的情况下进入休眠状态,因为休眠意味着线程处于活动状态,但没有取得任何进展,睡眠时线程不处于活动状态。我将重写。如果线程正在睡眠,则Thread.isAlive返回true。@持续睡眠与锁无关。从这里开始,调整你的思维。它们是完全独立的概念,彼此完全不相关。为什么线程在睡眠时维护锁?什么锁?sleep是一种静态方法。没有与线程关联的锁。sleep调用因为没有与之关联的对象。请仔细阅读::导致当前正在执行的线程睡眠并暂时停止执行指定的毫秒数,具体取决于系统计时器和调度程序的精度和准确性。该线程不会失去任何监视器的所有权。@顽强,我的回答从调用它的线程的角度来描述thread.sleepn。调用不返回任何内容,没有任何副作用,经过n毫秒后,它会返回。你可以说Thread.sleep也做Thread.yield做的事情,但我要反驳的是,任何程序都不应该依赖Thread.yield来做任何事情。