publicclassMyContainer1<T>{finalprivate LinkedList<T> list =newLinkedList<>();finalprivateint MAX =10;// 容器最大容量privateint count =0;publicsynchronizedvoidput(T t){while(list.size()== MAX){// 注意此处用while而不是iftry{this.wait();// wait会主动释放锁}catch(InterruptedException e){
e.printStackTrace();}}
list.add(t);++count;this.notifyAll();// 注意此处为notifyAll而不是notify,因为notify是随机唤醒一个线程,很可能又是一个生产者,接着wait继续执行,检查while条件,如果成立,wait,程序不动了。}publicsynchronized T get(){
T t = null;while(list.size()==0){try{this.wait();}catch(InterruptedException e){
e.printStackTrace();}}
t = list.removeFirst();
count--;this.notifyAll();return t;}}
使用Lock和Condition来实现
publicclassMyContainer2<T>{finalprivate LinkedList<T> list =newLinkedList<>();finalprivateint MAX =10;// 容器最大容量privateint count =0;private Lock lock =newReentrantLock();private Condition producer = lock.newCondition();private Condition consumer = lock.newCondition();publicvoidput(T t){
lock.lock();try{while(list.size()== MAX){
producer.await();}
list.add(t);
count++;
consumer.signalAll();}catch(InterruptedException e){
e.printStackTrace();}finally{
lock.unlock();}}public T get(){
T t = null;
lock.lock();try{while(list.size()==0){
consumer.await();}
t = list.removeFirst();
count--;
producer.signalAll();}catch(InterruptedException e){
e.printStackTrace();}finally{
lock.unlock();}return t;}}