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