张老师:Condition多路例子

来源:互联网 发布:服装行业进销存软件 编辑:程序博客网 时间:2024/05/16 08:52

简介

Lock的作用就相当于synchronized,使用Lock就不需要使用synchronized,相反同理。
使用synchronized时等待和唤醒使用的是object.await()和object.notify();
使用Lock时使用等待和唤醒使用的是condition.await()和condition.signal();
Lock和synchronized的区别在于前者可以实现多路Condition,而后者不能有多个object,不能实现多路

例子

import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 阻塞队列 * 采用多路Condition * @author liujun */public class BoundedBuffer {/**锁*/final Lock lock = new ReentrantLock();/**通知满条件*/final Condition notFull = lock.newCondition();/**通知空条件*/final Condition notEmpty = lock.newCondition();/**阻塞队列数组对象*/final Object[] items = new Object[100];/**放下标,取下标和当前队列元素个数*/int putIndex , takeIndex, count;public void put(Object element) throws Exception {lock.lock();try {while(count == items.length){//队列已满notFull.await();//队列满等待}//存放数据items[putIndex] = element;if (++putIndex == items.length){putIndex = 0;}count ++;//唤醒空等待notEmpty.signal();} finally {lock.unlock();}}public Object take() throws Exception {lock.lock();Object value = null;try {while(count == 0) {//队列为空notEmpty.await(); //队列空等待}//取出数据value = items[takeIndex];if (++takeIndex == items.length) {takeIndex = 0;}count --;//唤醒满等待notFull.signal();return value;} finally {lock.unlock();}}}




0 0
原创粉丝点击