线程等待 wait 线程唤醒 notify

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、必须在同步方法中使用waitnotify方法,因为执行wait和notify的前提条件是必须持有同步方法的monitor的所有权,否则会抛出非法的monitor状态异常IllegalMonitorStateException
4、用哪个对象的monitor进行同步,就只能用哪个对象进行waitnotify操作。否则会抛出IllegalMonitorStateException异常信息:

-----------------------------------------------------------------------------读书笔记摘自书名:Java高并发编程详解:多线程与架构设计 作者:汪文君

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值