在了解这两个方法之前,先了解两个概念锁池(EntryList)和等待池(WaitSet)
锁池
假设线程A已经拥有了某个对象(不是类)的锁,而其他线程B,C想要调用这个对象的某个sychronized方法(或者块),由于B,C线程在进入对象的sychronized方法(或者块)之前必须获得该对象锁的拥有权而恰巧该对象的锁正在被线程A锁占有,此时B,C线程就会被阻塞,进入一个地方去等待锁的释放,这个点便是该对象的锁池,简要理解就是需要获取锁的线程进行等待的地方.
等待池
假设线程A调用了某个对象的wait方法,线程A就会释放对象的锁,同时线程A就进入了该对象的等待池中,进入等待池中的线程不会去竞争该对象的锁
重点:锁池和等待池都是针对对象而言的
notify和notifyAll的区别
- notifyAll会让所有处于等待池的线程全部进入锁池去竞争锁的机会
- notify只会随机选取一个等待池的线程进入锁池去竞争获取锁的机会