标签:JavaWeb 队列 haed 阻塞 int tail array BlockingQueue
文章目录
如何实现生产者消费者模型?
- 简单来说就是使用阻塞队列来实现该模型
- 阻塞队列的实现:
- 阻塞队列依旧是一个先进先出的队列
- 入队列时如果发现队列满了,就会阻塞,直到其他线程调用出队列操让队列有空位之后 ,才能继续入队列
- 出队列的时候如果发现队列为空,也会阻塞, 直到其他线程调用入队列操作rag队列有元素,才能继续出队列
实现阻塞队列
//阻塞队列
public class BlockingQueue {
private int[] array = new int[20];
private int haed = 0;
private int tail = 0;
private volatile int size = 0;
//put向队列放元素
public void put(int val) throws InterruptedException {
synchronized (this) {
while (this.size == array.length) {
this.wait();
}
array[tail] = val;
tail++;
size++;
if (tail == array.length) {
this.tail = 0;
}
this.notify();
}
}
//take取队首元素
public int take() throws InterruptedException {
int ret;
synchronized (this) {
while (this.size == 0) {
this.wait();
}
ret = array[haed];
haed++;
size--;
if (haed == array.length) {
this.haed = 0;
}
this.notify();
}
return ret;
}
}
代码分析
- 详细说一下为什么判断空或者满要使用while而不是使用if
假设现在又三个线程 一个生产 俩个消费
而且是消费快 生产慢
此时俩个消费都会判断为空然后进入wait
如果此时我们不小心使用了notiAll唤醒了所有等待的线程
于是消费者1先得到锁 执行了出队列操作 生产者还没来得及生产 消费者2就又获取了锁 此时刚刚生产了一个元素已经被消费者拿走了 当前已经是一个空队列了
如果再往下执行就会发生逻辑错误 结果就不可控了 - 所以我们在判断条件进行使用wait的时候 都推荐使用while去搭配而不是if
标签:JavaWeb,队列,haed,阻塞,int,tail,array,BlockingQueue 来源: https://blog.csdn.net/Shangxingya/article/details/106733281
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。