wait/notify是线程间同步机制
原理
当调用这个对象的wait方法时,将当前线程放到这个线程列表里(类似一个map结构,key是对象,value是一个线程列表),当调用这个对象的notify方法时(调用notify的线程在“退出其同步块”的时候唤醒起最后一个进入wait状态的线程)从这个线程列表里取出一个来让其继续执行。
具体过程
wait处理过程中会临时释放同步锁。
当某个线程调用notify唤起了这个线程的时候,在wait方法退出之前会重新获取这把锁。
wait方法被唤醒起来的时候会去检测线程状态,当有别的线程interrupt它的时候,它就会抛出InterruptedException异常从阻塞状态恢复过来
notify和notifyAll
notify来唤起的线程,那先进入wait的线程会先被唤起来
nootifyAll唤起的线程,默认情况是最后进入的会先被唤起来,即LIFO的策略
notifyAll的实现是调用notify的线程在退出其同步块的时候唤醒起最后一个进入wait状态的线程,然后这个线程退出同步块的时候继续唤醒其倒数第二个进入wait状态的线程,依次类推
性能
当线程进入到wait状态的时候会放弃cpu,不会占用cpu资源,load不会有影响
demo
new Thread(){
public void run(){
synchronized (lock){
try{
lock.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}.start();
new Thread(){
public void run(){
synchronized (lock){
lock.notify();
}
}
}.start();
底层实现技术
有兴趣的同学也可以继续深入学习
- park/unpark机制
- monitorenter/monitorexit
- linux系统调用pthread_cond_wait/pthread_cond_signal