volidate使用方法 参考文档html
描述: 声明一个Plate对象为plate,被线程A和线程B共享,A专门放鸡蛋,B专门拿鸡蛋。假设 开始,A调用plate.putEgg方法,此时eggs.size()为0,所以顺利将鸡蛋放到盘子,还执行了notify()方法,唤醒锁的阻塞队列的线程,此时阻塞队列尚未线程。java
又有一个A线程对象调用plate.putEgg方法,此时eggs.size()不为0,调用wait()方法,本身进入了锁对象的阻塞队列。测试
此时,来了一个B线程对象,调用plate.getEgg方法,eggs.size()不为0,顺利的拿到了一个鸡蛋,还执行了notify()方法,唤醒锁的阻塞队列的线程,此时阻塞队列有一个A线程对象,唤醒后,它进入到就绪队列,就绪队列也就它一个,所以立刻获得锁,开始往盘子里放鸡蛋,此时盘子是空的,所以放鸡蛋成功。线程
假设接着来了线程A,就重复2;假设来料线程B,就重复3。code
整个过程都保证了放鸡蛋,拿鸡蛋,放鸡蛋,拿鸡蛋。htm
package thread; import java.util.ArrayList; import java.util.List; /** * * @author sb * */ public class Plate{ List<Object> eggs=new ArrayList<Object>(); public synchronized Object getEgg(){ if(eggs.size()==0){ try{ wait(); //这里放弃了同步锁,好不容易获得,又放弃了 }catch(InterruptedException e){ } } Object egg=eggs.get(0); System.out.println("取鸡蛋"); eggs.clear();//清空盘子 notify();//唤醒阻塞队列的某线程到就绪队列 return egg; } public synchronized void putEgg(Object egg){ if(eggs.size()>0){ try{ wait(); //这里放弃了同步锁,好不容易获得,又放弃了 }catch(InterruptedException e){ } } eggs.add(egg);//往盘子里放鸡蛋 System.out.println("放鸡蛋"); notify();//唤醒阻塞队列的某线程到就绪队列 } }
测试:对象
package thread; public class PlateTest { public static void main(String[] args) { Plate plate = new Plate(); for(int i =0 ; i<100;i++){ plate.putEgg("a"); plate.getEgg(); } } }
测试输出结果:blog
放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋 放鸡蛋 取鸡蛋