文章目录
如何实现生产者消费者模型?
实现阻塞队列
//阻塞队列 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; } }
代码分析
假设现在又三个线程 一个生产 俩个消费
而且是消费快 生产慢
此时俩个消费都会判断为空然后进入wait
如果此时我们不小心使用了notiAll唤醒了所有等待的线程
于是消费者1先得到锁 执行了出队列操作 生产者还没来得及生产 消费者2就又获取了锁 此时刚刚生产了一个元素已经被消费者拿走了 当前已经是一个空队列了
如果再往下执行就会发生逻辑错误 结果就不可控了
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算