多线程之等待与唤醒机制

本文深入探讨线程间的等待与唤醒机制,解析synchronized与lock的wait/notify及await/signal功能,阐述线程同步队列与等待队列模型,以及Object类中wait(), notify()和notifyAll()等关键API的使用细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

等待与唤醒机制(线程间通信方式之一)

1. synchronized的wait/notify  

调用notify后,将等待队列的线程唤醒值同步队列的末尾排队获取锁

notify线程直到将自己的同步代码块执行完后,才会释放锁。

任意一个monitor有一个同步队列和一个等待队列(生产,消费者的wait都进入一个队列)
只有一个等待队列时,唤醒所有线程(notifyall)一定会唤醒不该唤醒的线程,此时又要去阻塞它,就会造成浪费,性能开销。
2. lock的await/siganl(类似于)
condition:等待队列模型
任意一个lock的对象有一个同步队列和多个等待队列(lock.condition)

lock下的另一个子类:ReentrantReadWriteLock

详解:在Object.java中,定义了wait(), notify()和notifyAll()等接口。
wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。
而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;
notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。

Object类中关于等待/唤醒的API详细信息如下:

  • notify() – 唤醒在此对象监视器上等待的单个线程
  • notifyAll() – 唤醒在此对象监视器上等待的所有线程。
  • wait() – 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)。
  • wait(long timeout) – 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。
  • wait(long timeout, int nanos) – 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量”,当前线程被唤醒(进入“就绪状态”)。
  • 注意:jdk的解释中,说wait()的作用是让“当前线程”等待,而“当前线程”是指正在cpu上运行的线程!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值