美文网首页
sleep和wait的区别

sleep和wait的区别

作者: 山不转人自转 | 来源:发表于2020-11-10 20:30 被阅读0次

    总结以下四点:

    1、sleep是Thread中的方法,而wait方法是Object中的方法(即任何对象都能调用wait方法)。

    2、sleep方法不会释放锁,而wait方法会释放锁,且加入到等待队列中,直到被唤醒,或者通过设定时间 到达指定时间后线程处于空闲状态则可以立马获取到。

    3、sleep方法不依赖于同步器synchronized,但是wait方法需要依赖synchronized关键字。

    没有上锁报了这个错误
    也就是当前的线程不是此对象监视器的所有者。没有获取到锁对象,就是说这里需要用到同步锁synchronized关键字上锁,否则就会报IllegalMonitorStateException异常。
    “问:为什么只能用在同步锁synchronized代码块中使用?”

    4、sleep不需要被唤醒(休眠之后继续执行),但是wait需要,如果没有设定毫秒值,则需要等待有线程调用notify()或者notifyAll() 才能使其竞争锁 负责就是死锁了。

    sleep没什么好讲的,唯一好处就是可以在任何地方使用,但是要捕获异常。

    解答:

    1.首先,要明白,每个对象都可以被认为是一个"监视器monitor",这个监视器由三部分组成(一个独占锁,一个入口队列,一个等待队列)。注意是一个对象只能有一个独占锁,但是任意线程都可以拥有这个独占锁。

    2.对于对象的非同步方法而言,任意时刻可以有任意个线程调用该方法。

    3.对于对象的同步方法而言,只有拥有这个对象的独占锁才能调用这个同步方法。如果这个独占锁被其他线程占用,那么另外一个调用该同步方法的线程就会处于阻塞状态,此线程进入入口队列,就好比先前说的如果线程不是空闲状态其他线程只能等待,并不能竞争锁。

    4.若一个拥有该独占锁的线程调用该对象同步方法的wait()方法,则该线程会释放独占锁,并加入对象的等待队列;

    5.则某个线程调用notify(),notifyAll()方法是将等待队列的线程转移到入口队列,然后让他们竞争锁,所以这个调用线程本身必须拥有锁。

    Synchronized应用举例:生产者消费者模型

    消费者线程需要等待直到生产者线程完成一次写入操作。生产者线程需要等待消费者线程完成一次读取操作。假设没有应用Synchronized关键字,当消费者线程执行wait操作的同时,生产者线程执行notify,生产者线程可能在等待队列中找不到消费者线程。导致消费者线程一直处于阻塞状态。那么这个模型就要失败了。所以必须要加Synchronized关键字。

    相关文章

      网友评论

          本文标题:sleep和wait的区别

          本文链接:https://www.haomeiwen.com/subject/uvtjbktx.html