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

深圳网站建设微信开发烟台食品公司中企动力提供网站建设

深圳网站建设微信开发,烟台食品公司中企动力提供网站建设,桂林最好玩的5个地方,抖音服务商平台转载自 三个好用的并发工具类 以前的文章中#xff0c;我们介绍了太多的底层原理技术以及新概念#xff0c;本篇我们轻松点#xff0c;了解下 Java 并发包下、基于这些底层原理的三个框架工具类。 它们分别是#xff1a; 信号量 Semaphore 倒计时门栓 CountDownLatch …转载自  三个好用的并发工具类 以前的文章中我们介绍了太多的底层原理技术以及新概念本篇我们轻松点了解下 Java 并发包下、基于这些底层原理的三个框架工具类。 它们分别是 信号量 Semaphore 倒计时门栓 CountDownLatch 屏障 CyclicBarrier 所以既然是工具类那么必然是离不开特定的场景的于是相互之间没有谁优谁劣只有谁更合适。 信号量 Semaphore Semaphore 适用于什么样的使用场景呢我们举个通俗的例子 假如现在有一个停车场里面有只十个停车位当着十个停车位都被占用了外面的车就不允许进入了就必须在外面等着。出来一辆车才允许进去一辆车 这个场景不同于我们一般的并发场景一般来说我们的临界资源只能允许一个线程进行访问其他线程都地等着。 但是有一种场景是临界资源允许多个线程同时访问超过限定数量的外的线程得阻塞等待。 这种情境使用原始的那一套也是能实现的但那叫「造轮子」Java 并发框架下给我们提供了一个工具类专门适用这种场景。 Semaphore 可以说是为上述这种场景而生的一个工具类我们写个 demo 实现上述逻辑 执行程序之后你会看到 你看出来一个线程才允许进去一个线程这就是 Semaphore。 semaphore 的内部原理其实你去看源码你会发现和我们的 ReentrantLock 的实现是极其类似的包括公平与非公平策略的支持只不过AQS 里面的 state 在前者的实现中一般小于等于一除非重入锁而后者的 state 则小于等于十记录的是剩余可用临界资源数量。 所以semaphore 天生就存在一个问题如果某个线程重入了临界区可用临界资源的数量是否需要减少 停车场一共十个停车位一辆车进去并占有了一个停车位过了一段时间这个向管理员报告我还要占用一个停车位先不管他占两个干啥此时的管理员会同意吗 实际上在 Java 这个管理员看来已经进入临界区的线程是「老爷」提出的要求都会优先满足即便他自身占有的资源并没有释放。 所以在 Semaphore 机制里一个线程进入临界区之后占用掉所有的临界资源都是可能的。 倒计时门栓 CountDownLatch 下面我们来看看这个 CountDownLatch名字听起来挺高级究竟提供了怎样的功能呢 有这么一个常见的场景我们一起来看看 大家日常经常使用的拼多多一件商品至少需要两到三人拼团商家才会发货。 这里我们不去研究它的商业模式不管他是怎么实现盈利的就这么一种场景如果要用基本的并发 API 来实现你可能会想到 来一个线程阻塞一次知道达到指定的数量后全部唤醒 对没错CountDownLatch 内部就是这样实现的轮子已经帮你造好了我们来看看该怎么实现上述的模型案例 多运行几次你会发现结果不会错拼团的人先后顺序可能不同但商家一定是在三个人都准备好了之后才会发货。 除此之外它还有更多的应用比如百米赛跑只有当所有运动员都准备好了之后裁判员才会吹响哨子等等等等。 实现原理也基本和显式锁类似不同点依然在于对 state 的控制CountDownLatch 只判断 state 是否等于零不等于零就说明时机未到阻塞当前线程。 而每一次的 countDown 方法调用都会减少一次倒计时资源直至为零才唤醒阻塞的线程。 循环屏障 CyclicBarrier CyclicBarrier 其实和 CountDownLatch 很像我们先介绍完 CyclicBarrier然后再和你一起去比较比较他俩的区别和相似点。 考虑这么一个场景 公寓的班车总是在公寓楼下装满一车人之后出发并开到地铁站接着再回来接下一班人。 这么一个场景我们考虑该怎么实现 效果大概就是这个样子 CyclicBarrier 就像一个屏障实例化的时候需要传入两个参数第一个参数指定我们的屏障最多拦截多少个线程后就打开屏障第二个参数指明最后一个到达屏障的线程需要额外做的操作。 一般而言最后一个线程到达屏障后屏障将会打开释放前面所有的线程并在最后重新关上屏障。 CyclicBarrier 只需要用到一个 await 就可以完成所有的功能我们总结下该方法的实现逻辑 首先减少一次可用资源数量 如果可用资源数为零则说明自己是最后一个线程于是会执行我们传入的额外操作唤醒所有已经到达在等待的线程并重新开启一个屏障计数。 否则说明自己不是最后一个线程于是将自身线程在一个循环当中阻塞到一个条件队列上 好了看完 CyclicBarrier 你会发现它真的很类似我们的倒计时门栓下面我们就来阐述他俩的区别与联系。 第一个区别 倒计时门栓 CountDownLatch 一旦被打开后就不能再次合上也是说只要被调用了足够次数的 countDownawait 方法就会失效它是一次性的。 CyclicBarrier 是循环发生的当最后一个线程到达屏障会优先重置屏障计数屏障再次开启拦截阻隔。 第二个区别 CountDownLatch 是计数器, 线程来一个就记一个此期间不阻塞线程当达到指定数量之后才会去唤醒外部等待的线程也就是说外部是有一个乃至多个线程等待一个条件满足之后才能继续执行而这个条件就是满足一定数量的线程这样才能激活当前外部线程的继续执行。 CyclicBarrier 像一个栅栏来一个线程阻塞一个直到阻塞了指定数量的线程后一次性全部激活让他们同时执行像一个百米冲刺一样。 最后的最后 好了以上就是我们 Java 并发包下面比较好用的三个工具类其中前两个的底层实现几乎完全依赖显式锁的原理方法后一个则是使用的显式锁加条件变量重新造的轮子都是非常好用的工具 除此之外还要说一点的是整个并发这块内容基本核心的东西我们都已经介绍完了共计十四篇文章从基本的线程概念到锁原理到线程池再到异步任务自认为总结的足够细致了不知道你了解了多少呢 记不住没关系我也为你提供了一份思维导图的总结罗列了上述基本的内容你可以对照着进行回顾同时也欢迎你私信我讨论探究。
http://wiki.neutronadmin.com/news/190400/

相关文章:

  • 南昌网站制作上海网站优化推广公司
  • 上海高端网站设计公司价格汕头网站建设维护
  • 做网站公司不给源码室内设计考研有哪些学校
  • 重庆施工员证书查询官方网站网站开发建设及推广合同
  • 网站托管套餐怎么在网页中加入图片
  • 深圳高端网站建设电话html5产品展示网站模板
  • 瑞安企业做网站垂直门户网站有哪些
  • 自己做网站赚钱吗社区门户网站模板
  • 大良营销网站建设好么设备网站模板
  • 做网站是网络维护好学吗
  • 用群晖做网站wordpress必备优化插件
  • muse怎么做响应式网站鄂州网吧暂停营业
  • 企业做定制网站的好处手机网站静态模板
  • 巴中 网站建设凡客诚品是什么牌子
  • 网上做设计的网站有哪些手术室专科建设网站
  • windows10网站建设wordpress阅读数
  • 南京建网站公司软件最全的网站
  • 旅游网站建设备案建设网站好公司简介
  • 用python写一个简单的网站营销型网站建设的标准
  • 合网站 - 百度昭通网站seo优化
  • 台州哪家做企业网站比较好网站跟网页的区别
  • ui的含义网站建设免费php网站模板
  • 做电脑网站用什么软件好用吗wordpress架设服务器
  • 怎样做网站关键字生产许可证查询官网
  • 淘宝禁止了网站建设类学做粤菜的网站有哪些
  • 招聘做网站专业人员wordpress缩略图题目文本链接
  • 个人网站设计源代码企业天眼查询信息官网
  • 河北集团网站建设网站开发前端基础
  • 外贸推广免费网站wordpress修改邮件地址
  • 如何判断网站程序使用asp还是php给企业做网站 内容需要对方提供