notifyAll()方法按照后进先出算法唤醒所有wait状态的线程,即LIFO。
执行完唤醒方法,并不会立即唤醒等待线程,在hotspot中是退出同步块的时候才会去真正唤醒对应的线程。
notifyAll()唤醒过程还使用了monitorexit,当某个线程从wait状态恢复时,要先获取锁,然后再退出同步块,并唤醒下一个(最先)进入wait状态的线程,依次类推。
wait/nofity是通过jvm里的park/unpark机制来实现的,在linux下这种机制又是通过pthread_cond_wait/pthread_cond_signal来实现的,因此当线程进入到wait状态的时候其实是会放弃cpu的,也就是说这类线程是不会占用cpu资源。
这些策略都可以通过修改JVM参数来改变。