wait
# wait是Object中的方法,所有对象都有此方法
# wait()需要被唤醒、wait(long timeout)需要被唤醒或者超时自动唤醒
# wait方法是可中断方法
public final void wait() throws InterruptedException // 本质wait(0),0代表着永不超时
public final void wait(long timeout) throws InterruptedException
public final void wait(long timeout, int nanos) throws InterruptedException
[Q&A] 调用lock.wait()
会发生3件事
1、释放锁对象lock
(前提是wait方法必须拥有该对象的monitor
,也就是wait方法必须在同步方法中使用)
2、线程状态变成WAITING
3、线程进入lock对象的 等待队列(wait set
)
notify
# 1、notify是Object中的方法,所有对象都有此方法
# 2、如果有某个线程由于执行该对象的wait方法而进入阻塞则会被唤醒,如果没有则会忽略。
# 3、被唤醒的线程需要重新获取对该对象所关联monitor的lock才能继续执行。
notifyAll
# 和nofity无异,但是notifyAll 可以同时唤醒全部的阻塞线程
关于wait和notify的注意事项
2、每一个对象的monitor都有一个与之关联的wait set
,线程执行了某个对象的wait
方法以后,会加入与之对应的wait set
中,notify
方法可以将其唤醒,也就是从wait set
中弹出
。
3、必须在同步方法
中使用wait
和notify
方法,因为执行wait和notify的前提条件是必须持有同步方法的monitor的所有权,否则会抛出非法的monitor状态异常IllegalMonitorStateException
:
4、用哪个对象的monitor
进行同步,就只能用哪个对象进行wait
和notify
操作。否则会抛出IllegalMonitorStateException
异常信息:
-----------------------------------------------------------------------------读书笔记摘自书名:Java高并发编程详解:多线程与架构设计 作者:汪文君