多线程之等待与唤醒机制

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

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上运行的线程!

你可能感兴趣的:(Java)