sleep和wait的区别

一、sleep是Thread的方法,wait是Object的方法

二、sleep不释放锁,wait会释放

        线程调用sleep方法后,当前线程会进行睡眠,且线程进入阻塞状态,但不会释放已持有的锁(如果有的话,如果没有锁也可以执行sleep方法)。即线程只会让出cpu执行时间片,不会释放同步资源锁。

        线程执行wait方法后,当前线程会进入阻塞等待状态,让出cpu执行时间片的同时释放同步资源锁(一定有锁,因为wait方法必须和synchronized或Lock一起使用,即第三点)

三、sleep不依赖同步方法,wait依赖

执行wait()报错
报错信息

可见wait方法必须在同步代码区中执行(synchronized或lock)。而sleep方法不需要。

四、sleep不需要被唤醒,wait需要。

sleep比较简单,我们着重看一下wait,我们可以去查看到源码中的一段注释。

jdk源码中wait方法的注释

翻译一下就是:

导致当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法。 换句话说,此方法的行为就像它简单地执行调用wait(0)一样。

当前线程必须拥有该对象的监视器。线程释放对此监视器的所有权,并等待直到另一个线程通过调用notify方法或notifyAll方法通知等待在该对象的监视器上唤醒的线程。然后线程等待,直到可以重新获得监视器的所有权并恢复执行。

与在一个参数版本中一样,可能发生中断和虚假唤醒,并且该方法应始终在循环中使用:...此方法只能由作为此对象的监视器的所有者的线程调用。有关线程可以成为监视器所有者的方式的说明,请参见{@code notify}方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。