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

上海十大广告公司排名seo网站建设 厦门

上海十大广告公司排名,seo网站建设 厦门,安徽地图,ai软件写在开头 在很多的面经中都看到过提问 CountDownLatch 的问题#xff0c;正好我们最近也在梳理学习AQS#xff08;抽象队列同步器#xff09;#xff0c;而CountDownLatch又是其中典型的代表#xff0c;我们今天就继续来学一下这个同步工具类#xff01; CountDownLatc…写在开头 在很多的面经中都看到过提问 CountDownLatch 的问题正好我们最近也在梳理学习AQS抽象队列同步器而CountDownLatch又是其中典型的代表我们今天就继续来学一下这个同步工具类 CountDownLatch有何作用 我们知道AQS是专属于构造锁和同步器的一个抽象工具类基于它Java构造出了大量的常用同步工具如ReentrantLock、Semaphore、ReentrantReadWriteLock、SynchronousQueue等等我们今天的主角CountDownLatch同样如此。 CountDownLatch(倒时器)允许N个线程阻塞在同一个地方直至所有线程的任务都执行完毕。CountDownLatch 有一个计数器可以通过countDown()方法对计数器的数目进行减一操作也可以通过await()方法来阻塞当前线程直到计数器的值为 0。 CountDownLatch的底层原理 想要迅速了解一个Java类的内部构造或者使用原理最快速直接的办法就是看它的源码这是很多初学者比较抵触的会觉得很多封装起来的源码都晦涩难懂诚然很多类内部实现是复杂但我们作为Java工程师也不能只追求CRUD呀培养自己看源码的习惯硬着头皮看段时间代码能力绝对会提升的 废话说的有点多了我们直接进入CountDownLatch内部去看看它的底层原理吧 【源码解析1】 //几乎所有基于AQS构造的同步类内部都需要一个静态内部类去继承AQS private static final class Sync extends AbstractQueuedSynchronizer {private static final long serialVersionUID 4982264981922014374L;Sync(int count) {setState(count);}int getCount() {return getState();}} private final Sync sync; //构造方法中初始化count值 public CountDownLatch(int count) {if (count 0) throw new IllegalArgumentException(count 0);this.sync new Sync(count); }几乎所有基于AQS构造的同步类内部都需要一个静态内部类去继承AQS并实现其提供的钩子方法通过封装AQS中的state为count来确定多个线程的计时器。 countDown()方法 【源码解析2】 //核心方法内部封装了共享模式下的线程释放public void countDown() {//内部类Sync继承了AQSsync.releaseShared(1);}//AQS内部的实现public final boolean releaseShared(int arg) {if (tryReleaseShared(arg)) {//唤醒后继节点doReleaseShared();return true;}return false;} 在CountDownLatch中通过countDown来减少倒计时数这是最重要的一个方法我们继续跟进源码看到它通过releaseShared()方法去释放锁这个方法是AQS内部的默认实现方法而在这个方法中再一次的调用了tryReleaseShared(arg)这是一个AQS的钩子方法方法内部仅有默认的异常处理真正的实现由CountDownLatch内部类Sync完成 【源码解析3】 // 对 state 进行递减直到 state 变成 0 // 只有 count 递减到 0 时countDown 才会返回 true protected boolean tryReleaseShared(int releases) {// 自选检查 state 是否为 0for (;;) {int c getState();// 如果 state 已经是 0 了直接返回 falseif (c 0)return false;// 对 state 进行递减int nextc c-1;// CAS 操作更新 state 的值if (compareAndSetState(c, nextc))return nextc 0;} }await()方法 除了countDown()方法外在CountDownLatch中还有一个重要方法就是 await 在多线程环境下线程的执行顺序并不一致因此对于一个倒时器也说先开始的线程应该阻塞等待直至最后一个线程执行完成而实现这一效果的就是await()方法 【源码解析4】 // 等待也可以叫做加锁 public void await() throws InterruptedException {sync.acquireSharedInterruptibly(1); } // 带有超时时间的等待 public boolean await(long timeout, TimeUnit unit)throws InterruptedException {return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout)); }其中await()方法可以配置带有时间参数的表示最大阻塞时间当调用 await() 的时候如果 state 不为 0那就证明任务还没有执行完毕await() 就会一直阻塞也就是说 await() 之后的语句不会被执行。然后CountDownLatch 会自旋 CAS 判断 state是否等于0若是就会释放所有等待的线程await() 方法之后的语句得到执行。 CountDownLatch的使用 由于await的实现步骤和countDown类似我们就不贴源码了大家自己跟进去也很容易看明白我们现在直接来一个小demo感受一下如何使用CountDownLatch做一个倒时器 【代码样例1】 public class Test {public static void main(String[] args) throws InterruptedException {// 创建一个倒计数为 3 的 CountDownLatchCountDownLatch latch new CountDownLatch(3);Thread service1 new Thread(new Service(3, 1000, latch));Thread service2 new Thread(new Service(2, 2000, latch));Thread service3 new Thread(new Service(1, 3000, latch));service1.start();service2.start();service3.start();// 等待所有服务初始化完成latch.await();System.out.println(发射);}static class Service implements Runnable {private final String name;private final int timeToStart;private final CountDownLatch latch;public Service(String name, int timeToStart, CountDownLatch latch) {this.name name;this.timeToStart timeToStart;this.latch latch;}Overridepublic void run() {try {Thread.sleep(timeToStart);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(name);// 减少倒计数latch.countDown();}} }输出 3 2 1 发射执行结果体现出了倒计时的效果每隔1秒进行321的倒数其实除了倒计时器外CountDownLatch还有另外一个使用场景实现多个线程开始执行任务的最大并行性 多个线程在某一时刻同时开始执行。类似于赛跑将多个线程放到起点等待发令枪响然后同时开跑。 具体做法是 初始化一个共享的 CountDownLatch 对象将其计数器初始化为 1 new CountDownLatch(1)多个线程在开始执行任务前首先 coundownlatch.await()当主线程调用 countDown() 时计数器变为 0多个线程同时被唤醒。 【代码样例2】 public class Test {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch new CountDownLatch(1);for (int i 0; i 5; i) {new Thread(() - {try {System.out.println(5位运动员就位);//等待发令枪响countDownLatch.await();System.out.println(Thread.currentThread().getName() 起跑);} catch (InterruptedException e) {e.printStackTrace();}}).start();}// 裁判准备发令Thread.sleep(2000);//发令枪响countDownLatch.countDown();} }输出 5位运动员就位 5位运动员就位 5位运动员就位 5位运动员就位 5位运动员就位 Thread-0起跑 Thread-3起跑 Thread-4起跑 Thread-1起跑 Thread-2起跑结尾彩蛋 如果本篇博客对您有一定的帮助大家记得留言点赞收藏呀。原创不易转载请联系Build哥 如果您想与Build哥的关系更近一步还可以关注“JavaBuild888”在这里除了看到《Java成长计划》系列博文还有提升工作效率的小笔记、读书心得、大厂面经、人生感悟等等欢迎您的加入
http://www.zqtcl.cn/news/564792/

相关文章:

  • 网站策划怎么做内容朔州网站建设公司
  • 宁波拾谷网站建设蚌埠网站建设中心
  • 青岛专业设计网站公司加拿大广播公司
  • 盘锦市建设局网站地址八桂职教网技能大赛
  • 投资建设一个网站多少钱和淘宝同时做电商的网站
  • 做动物网站的素材icp备案 网站备案
  • 找人建网站唐山网络运营推广
  • 福建省住房建设厅网站6网站简历模板
  • 医疗网站模版杭州工商注册
  • 正保建设工程网站logo创意
  • 简洁个人博客网站模板下载用自己电脑做网站服务器-phpstudy+花生壳
  • 网页模板下载哪个网站好多个域名指定同一个网站好处
  • 北京网站建设有哪些公司微网站的案例
  • 常德经开区网站官网域名备案关闭网站吗
  • 做宠物网站的工作室做网站租服务器
  • 2017做那个网站致富网站换源码如何保留以前的文章
  • php网站开发实例教程书wordpress博客页面显示文章在哪
  • 地方o2o同城网站源码微信app开发价格表
  • 花木公司网站源码双语外贸网站源码
  • 什么公司做网站会提供源代码创业做招商加盟类网站赚钱
  • 东莞网站建设排名基因数据库网站开发价格
  • 天河区营销型网站建设科技自立自强
  • 网站域名账号江苏百度推广代理商
  • 专题网站建站对网站分析
  • 外贸出口网站建设如何搭建自己的网站服务器
  • 云南省建设厅网站职称评审房地产推广方案和推广思路
  • 湘潭建设路街道网站app的设计与开发
  • 《网站开发实践》 实训报告广告策划书案例完整版
  • 一级 爰做片免费网站做中学学中做网站
  • 网站排名如何提升网络营销的有哪些特点