synchronized的底层实现monitor它有两个字段:EntryListWaitSet

 

锁池(EntryList)

如果线程A拥有了某个对象的锁的话,其他线程B、C想调用这个对象的synchronized方法(或者进入方法块)的话,就必须获得该对象锁的拥有权。

而这时该对象的锁被线程A锁占用,因此B、C线程就会被阻塞,进入到一个地方等待锁的释放,这个地方就是锁池。

等待池(WaitSet)

假设线程A调用了某个对象的wai()方法,线程A就会释放该对象的锁,同时线程A就进入到该对象的等待池中,具体来说就是monitor锁中的WaitSet中,并且进入等待池的线程都不会去竞争该对象的锁。

区别:

notify和notifyAll的作用就是在某个线程调用了wait()方法之后,对等待池中的这些线程进行一个唤醒操作,区别就是

notify只会随机选取一个处于等待池中的线程进入锁池去竞争获取锁的机会

notifyAll会让所有处于等待池的线程全部进入锁池去竞争获取锁的机会