在java中,每一个对象都有两个池,锁(monitor)池和等待池java
wait() ,notifyAll(),notify() 三个方法都是Object类中的方法.app
锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),因为这些线程在进入对象的synchronized方法以前必须先得到该对象的锁的拥有权,可是该对象的锁目前正被线程A拥有,因此这些线程就进入了该对象的锁池中。dom
等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(由于wait()方法必须出如今synchronized中,这样天然在执行wait()方法以前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中。若是另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会所有进入该对象的锁池中,准备争夺锁的拥有权。若是另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池.ide
下面经过一个例子来讲明:函数
要求写两个线程,一个线程将某个对象的某个成员变量的值加1,而另一个线程将这个成员变量的值减1.使得该变量的值始终处于[0,2].初始值为0.this
[java] view plain copyspa