------- <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>、期待与您交流! ----------