等待与唤醒机制(线程间通信方式之一)
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上运行的线程!