当前位置: 首页 > news >正文

网站功能列表广州网站关键词排名

网站功能列表,广州网站关键词排名,营销型网站主页定制,个人微信小程序开发顾名思义,就是一种在对队列进行出队或者入队操作的时候会阻塞的队列。下面使用JDK17中的LinkedBlockingQuece进行简单的介绍。 LinkedBlockingQueue基本结构 LinkedBlockingQueue的主要结构以及构成的数据结构如下图所示。具体来说包括 存储元素的链表&#xff0…

顾名思义,就是一种在对队列进行出队或者入队操作的时候会阻塞的队列。下面使用JDK17中的LinkedBlockingQuece进行简单的介绍。

LinkedBlockingQueue基本结构

LinkedBlockingQueue的主要结构以及构成的数据结构如下图所示。具体来说包括

  • 存储元素的链表,first指针指向队头,last指针指向队尾。
  • 控制向队列中入队节点的可重入锁 putLock,以及队列满时让生产者线程排队等待的 notFull 条件等待队列。
  • 控制向队列中出队节点的可重入锁 takeLock,以及队列为空的时候让消费者排队的 notEmpty 条件等待队列。
  • 尝试入队操作的生产者线程。
  • 尝试出队操作的消费者线程。

接下来介绍LinkedBlockingQueue的几个基本操作。

入队操作:

  • put(E) 将元素入队,如果队列满了那么将操作线程放入等待队列notFull, 直到入队成功。
  • offer(E) 将元素入队,如果队列满了那么直接返回false,入队失败。

出队操作:

  • take() 将元素出队,如果队列为空那么将操作线程放入等待队列notEmpty,直到出队成功。
  • poll() 将元素出队,如果队列为空返回false,出队失败。

put,offer以及 take,poll的操作之间的不同都是在队列不满足条件的时候是将其放入条件等待队列等待队列满足条件的时候唤醒还是直接返回false表示操作失败。

出队入队的基本操作

put(E e)

具体流程如下图所示,这是一个线程安全的队列,因为每次队队列的入队出队操作必须获取锁之后才会继续运行。生产者线程在获取了putLock后判断队列是否还会达到容量,如果还有容量那么直接放入,如果队列已满那么放入notFull等待队列中。因为生产者在队尾操作,消费者在队头操作,不会相互影响,在新增节点的过程中可能会有节点出队。所以在放入元素后判断队列是否还有容量,如果有就将notFull等待队列中的线程唤醒。在释放锁后判断在插入前队列是否为空,如果为空,说明可能有消费者线程在条件等待队列中等待获取元素,那么就去唤醒notEmpty中的线程,这些线程由于之前队列为空被放入条件等待队列等待。

public void put(E e) throws InterruptedException {if (e == null) throw new NullPointerException();final int c;final Node<E> node = new Node<E>(e);final ReentrantLock putLock = this.putLock;final AtomicInteger count = this.count;putLock.lockInterruptibly();try {/** Note that count is used in wait guard even though it is* not protected by lock. This works because count can* only decrease at this point (all other puts are shut* out by lock), and we (or some other waiting put) are* signalled if it ever changes from capacity. Similarly* for all other uses of count in other wait guards.*/while (count.get() == capacity) {notFull.await();}enqueue(node);c = count.getAndIncrement();if (c + 1 < capacity)notFull.signal();} finally {putLock.unlock();}if (c == 0)signalNotEmpty();
}

take()

take操作与put操作类似,只不过操作的锁和等待队列恰好相反。

public E take() throws InterruptedException {final E x;final int c;final AtomicInteger count = this.count;final ReentrantLock takeLock = this.takeLock;takeLock.lockInterruptibly();try {while (count.get() == 0) {notEmpty.await();}x = dequeue();c = count.getAndDecrement();if (c > 1)notEmpty.signal();} finally {takeLock.unlock();}if (c == capacity)signalNotFull();return x;}

另外需要注意的是 使用的两个可重入锁为 非公平锁,也就是说队列中的顺序并不严格满足先进先出的特性。源码的解释也有点冲突。

http://www.ds6.com.cn/news/93106.html

相关文章:

  • 注册网站要身份证吗艾滋病多久能查出来
  • 哪个网站做电商门槛最低什么是核心关键词
  • 咖啡网站开发背景百度推广账户登录首页
  • 惠州专业的免费建站长尾关键词挖掘工具
  • 网站怎么做才能将名声打响怎么引流到微信呢
  • 做网站是58好还是百度好百度官网下载电脑版
  • 网站搜索seo自动点击排名
  • 网站的支付系统怎么做的百度快照推广排名
  • 广东网站建设方便化妆品软文推广范文
  • 做初中试卷的网站seo技术 快速网站排名
  • 做企业网站大约多少钱今日国际新闻10条
  • 广州住建官方网站网络营销的好处和优势
  • 做免费采集电影网站犯法吗地推团队联系方式
  • 开发网站手机版百度推广后台登陆首页
  • 登录注册网站怎么做最近几天新闻大事
  • 怎么做仲博注册网站nba最新排行
  • 网站建设是软件开发吗南昌seo搜索排名
  • 高德地图能在香港用么seo代码优化有哪些方法
  • 网站建设基本要求武汉seo服务
  • 茶网站源码微信推广方式有哪些
  • 网站批量上传文章百度手游app下载
  • 政府网站建设的创新机制什么是seo网站优化
  • 设计公司网站制作东莞新闻最新消息今天
  • 南京美容网站建设地推一手项目平台
  • 百度云可以做网站吗深圳seo教程
  • 实用网站建设期末考试如何建立自己的网站?
  • 一个做网站的团队需要哪些重庆网站seo好不好
  • 域名 备案 没有网站seo推广公司教程
  • 徐州靠谱网站开发公司优化是什么意思
  • 建怎么网站比较赚钱燃灯seo