浅谈Object notify notifyAll

文章目录

前言

莫信直中直,须防仁不仁。


目标

Object notify notifyAll基本概念

关键字

notify notifyAll

一、notify 定义

唤醒正在此对象的监视器上等待的单个线程。如果有任何线程在此对象上等待,则选择其中一个唤醒。该选择是任意的,并且可以根据实现情况进行选择。线程通过调用其中一个wait方法在对象的监视器上等待。
在当前线程放弃对该对象的锁定之前,唤醒的线程将无法继续。唤醒的线程将以通常的方式与任何其他可能正在主动竞争以在此对象上进行同步的线程竞争。例如,被唤醒的线程在成为锁定该对象的下一个线程时没有任何可靠的特权或劣势。
此方法只能由作为该对象的监视器的所有者的线程调用。
一次只能有一个线程拥有对象的监视器

线程可以通过以下三种方式之一成为对象监视器的所有者:

1 通过执行该对象的同步实例方法。
2 通过执行在对象上同步的同步语句的主体。
3 对于类类型的对象,通过执行该类的同步静态方法。

二、notifyAll定义

使当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法,或者经过了指定的时间。
当前线程必须拥有该对象的监视器。
此方法使当前线程(称为T)将自己置于该对象的等待集中,然后放弃对该对象的所有同步声明。出于线程调度目的,线程T被禁用,并且在发生以下四种情况之一之前一直处于休眠状态:
其他一些线程为此对象调用notify方法,并且线程T恰好被任意选择为要唤醒的线程。
其他一些线程为此对象调用notifyAll方法。
其他一些线程中断线程T。
指定的实时量或多或少已经过去。但是,如果超时为零,则不考虑实时,线程只是等待直到通知。
然后将线程T从该对象的等待集中删除,并重新启用线程调度。然后,它以通常的方式与其他线程竞争在对象上进行同步的权利。一旦它获得了对象的控制权,它对对象的所有同步声明都将恢复到原样-即,恢复到调用wait方法时的情况。然后,线程T从调用wait方法返回。因此,从等待方法返回时,对象和线程T的同步状态与调用等待方法时的状态完全相同。
线程也可以唤醒,而不会被通知,中断或超时,即所谓的虚假唤醒。尽管在实践中这种情况很少发生,但是应用程序必须通过测试应该导致线程唤醒的条件来防范它,并在条件不满足时继续等待。
换句话说,等待应该总是像这样循环执行:

    synchronized (obj) {
               while (<condition does not hold>)
                   obj.wait(timeout);
               ... // Perform action appropriate to condition
           }

如果当前线程在等待之前或等待期间被任何线程中断,则抛出InterruptedException。如上所述,直到该对象的锁定状态恢复之前,不会引发此异常。
请注意,wait方法将当前线程放入该对象的等待集中,因此仅解锁该对象;在线程等待时,当前线程可以在其上同步的所有其他对象保持锁定。
此方法只能由作为该对象的监视器的所有者的线程调用。有关线程可以成为监视器所有者的方式的描述,请参见notify方法。

参数:
超时–等待的最长时间(以毫秒为单位)。
抛出:
IllegalArgumentException-如果超时值为负。
IllegalMonitorStateException-如果当前线程不是对象监视器的所有者。
InterruptedException-如果任何线程在当前线程等待通知之前或之时中断了当前线程。引发此异常时,将清除当前线程的中断状态。

总结

参考

多留言多点赞你们的只支持是我坚持下去的动力,都支棱起来!!!

上一篇:Navicat for MySQL连接出错:1251


下一篇:谈谈Sleep和wait的区别