线程的等待与唤醒有两种方式:一、wait与notify;二、signal与await。两种方式的主要区别在于是否对等待的条件进行分区。第1种方式没有对不同等待条件的线程进行分区,这样在某些情况下就会降低效率,在"生产者消费者专题"中已经说过,第2种则解决了该问题。
唤醒是无记忆的也就是说先唤醒后等待,等待的线程是不会被唤醒的。一般在等待时会有一个等待条件,但是通常在检查等待条件时会使用while进行重复检查,因为即使被唤醒了也有可能还是满足等待条件的情况(见生产者消费者专题),所以需要具体情况具体分析,但为了省事重复检查是不会出错的。
唤醒又包括唤醒一个和唤醒多个,这两种情况在某些情况下区别很大(因为会死锁!)当存在不同的等待条件确使用了相同的条件对象(synchronized和同一个condition并使用notify或者signal)就会发生(见生产者费者专题–谈谈优化一),这种情况在java并发编程实战中又叫信号劫持(意思就是把不该唤醒的唤醒了)。