wait() 、notify/notifyAll()方法是 Object 的本地 final 方法,无法被重写。
wait()使当前线程阻塞,前提是必须先获得锁,一般配合synchronized关键字使用,即, 一般在 synchronized 同步代码块里使用 wait() 、 notify/notifyAll()方法。

3、 由于wait() 、 notify/notifyAll()在synchronized代码块执行,说明当前线程一定是 获取了锁的。
当线程执行wait()方法时候,会释放当前的锁,然后让出CPU,进入等待状态。
只有当notify/notifyAll()被执行时候,才会唤醒一个或多个正处于等待状态的线程,
然后继续往下执行,直到执行完synchronized代码块的代码或是中途遇到wait(),再次释 放锁。
3.3、也就是说,notify/notifyAll()的执行只是唤醒沉睡的线程,而不会立即释放锁,锁的 释放要看代码块的具体执行情况。所以在编程中,尽量在使用了 notify/notifyAll()后立即 退出临界区,以唤醒其他线程让其获得锁
4、 wait()需要被try catch包围,以便发生异常中断也可以使wait等待的线程唤醒。
5、 notify和wait的顺序不能错,如果A线程先执行notify方法,B线程在执行wait方法, 那么B线程是无法被唤醒的。
6、 notify和notifyAll的区别:notify方法只唤醒一个等待(对象的)线程并使该线程开 始执行。所以如果有多个线程等待一个对象,这个方法只会唤醒其中一个线程,选择哪个线程 取决于操作系统对多线程管理的实现。 notifyAll会唤醒所有等待(对象的)线程,尽管哪一个 线程将会第一个处理取决于操作系统的实现。如果当前情况下有多个线程需要被唤醒,推荐使 用notifyAll方法。比如在生产者-消费者里面的使用,每次都需要唤醒所有的消费者或是生 产者,以判断程序是否可以继续往下执行。
7、 在多线程中要测试某个条件的变化,使用if还是while?
要注意,notify唤醒沉睡的线程后,线程会接着上次的执行继续往下执行。所以在进行条件 判断时候,可以先把wait语句忽略不计来进行考虑;显然,要确保程序一定要执行,并且要 保证程序直到满足一定的条件再执行,要使用while进行等待,直到满足条件才继续往下执行

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.