黑马程序员-多生产多消费

------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! ----------
多生产多消费的问题:
我想生产一只烤鸭然后就消费一只烤鸭,当没有烤鸭时,消费者处于等待状态,或者是当有烤鸭时,生产者处于等待状态。
这主要是利用线程的等待与唤醒机制处理问题。wait、nitifyAll/notifyAll.
以一组消费生产为例,创建两个同步线程,一个用于生产者producer,一个用于消费者consumer。
当生产出一只烤鸭后,让生产者的线程处于等待状态,等待消费者消费完之后唤醒生产者。这种方法就是wait和notify/notifyAll.
//=================================
JDK1.5新特性:
改进以后将同步和锁封装成了对象,并将操作锁的隐式方法定义到了该对象中。将隐式动作变成了显示动作。
synchronized同步有两种,一种是同步方法,一种时同步代码块,但是,这两种都看不到具体操作锁的过程,因为他是在底层完成的。
现在,就将这种隐式的过程给显示化了。而且功能也增强了。
Lock接口:Lock接口的出现替代了同步代码块或者同步函数,将同步的隐式锁操作变成了显示锁操作。
lock()获取锁,unlock()释放锁。
Condition接口:Condition接口的出现替代了Object中的wait,notify,notifyAll方法。
Condition接口没有构造函数,他的实例对象时通过Lock实例对象的newCondition获的的。
Condition将这些监视器方法单独进行了封装,变成Condition监视器对象。可以任意锁进行组合。await,signal,signalAll方法。

问什么要改进 呢?
因为在线程等待被唤醒时,notifyAll是将所有的线程唤醒,本来我是只想让指定的线程唤醒,这样另外的线程也会一直循环判断会浪费资源。

//=================================
class BoundedBuffer {
//创建一个锁对象
   final Lock lock = new ReentrantLock();
//通过已有的锁获取该锁上两组监视器对象
   final Condition notFull  = lock.newCondition(); 
   final Condition notEmpty = lock.newCondition(); 
   final Object[] items = new Object[100];
   int putptr, takeptr, count;

   public void put(Object x) throws InterruptedException {
     lock.lock();//获取锁
     try {
       while (count == items.length) 
         notFull.await();//这里开始写成了this.wait();

       items[putptr] = x; 
       if (++putptr == items.length) putptr = 0;
       ++count;
       notEmpty.signal();
     } finally {
       lock.unlock();//释放锁的过程一定要放在finally里面,必须执行的过程。

     }
   }

   public Object take() throws InterruptedException {
     lock.lock();
     try {
       while (count == 0) 
         notEmpty.await();
       Object x = items[takeptr]; 
       if (++takeptr == items.length) takeptr = 0;
       --count;
       notFull.signal();
       return x;
     } finally {
       lock.unlock();
     }
   } 
 }
 
 
------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! ----------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值