多线程的“锁池”和“等待池”
多线程开发的一些概念和线程生命周期
synchronized修饰的方法,在执行的时候,线程会被排序依次执行。这时,线程会被阻塞在对象的“锁池”中,只有一个线程会被执行。至于哪个线程被执行,需根据不同的虚拟机实现机制不同。
进入synchronized方法块的线程,会立即持有该对象的锁,并从“锁池”中移除。执行完毕,会释放锁,“锁池”中的线程依据一定规则会有一个线程依次执行该synchronized代码块。
进入synchronized代码块的线程,如果执行wait方法,就会释放改对象锁,该线程进入“等待池”,知道其他线程调用该对象的notify方法是,才有可能被唤醒继续执行后续代码,线程被唤醒以后,该线程从“等待池”中移除。
每个对象都有自己的“锁池”和“等待池”,用来存放线程。线程进入“锁池”,会处于竞争锁状态,当其他线程释放锁以后,才可能竞争到锁,然后执行同步块代码。线程进入”等待池“,会等待其他线程调用notify或者notifyAll方法,来进入“锁池”状态。