张老师:Condition多路例子

本文介绍如何使用Lock和Condition实现阻塞队列,并对比synchronized关键字。通过具体代码示例展示了多路Condition的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

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();
		}
	}
	
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值