游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

CountDownLatchCyclicBarrierSem

  一、CountDownLatch:1、什么是CountDownLatch:
  CountDownLatch,闭锁,就是一个基于AQS共享模式的同步计数器,它内部的方法都是围绕AQS实现的。主要作用是使一个或一组线程在其他线程执行完毕之前,一直处于等待状态,直到其他线程执行完成后再继续执行。
  CountDownLatch利用AQS的state变量充当计数器(由volatile修饰并使用CAS进行更新的),计数器的初始值就是线程的数量,每当一个线程执行完成,计数器的值就会减一,当计数器的值为0时,表示所有的线程都已经完成任务了,那么接下来就唤醒在CountDownLatch上等待的线程执行后面的任务。
  那么当计数器的值为0时,主线程是如何被唤醒的呢?这就要从CountDownLatch的工作流程来说明了,CountDownLatch的工作流程可以看成在一开始只在CLH队列中放入一个主线程,然后不停的唤醒,唤醒之后如果发现state还是不为0,则继续等待。而主线程什么时候会被唤醒呢?当每个子线程执行完毕的时候,会调用countDown()并基于CAS将计数器state的值减一,减一成功释放资源后,就会调用unparkSuccessor()唤醒主线程,当所有的子线程都执行完了,也就是state为0时,这时候主线程被唤醒之后就可以继续执行了。
  state被减成了0之后,就无法继续使用这个CountDownLatch了,需要重新new一个,因为state的数量只有在初始化CountDownLatch的时候才可以设置,这也是CountDownLatch不可重用的原因。2、CountDownLatch的源码简单说明:
  从代码层面上来看,CountDownLatch基于内部类Sync实现,而Sync继承自AQS。CountDownLatch最主要有两个方法:await()和countDown()await():调用该方法的线程会被挂起,直到CountDownLatch计数器的值为0才继续执行,底层使用的是AQS的tryAcquireShared()countDown():用于减少计数器的数量,如果计数减为0的话,就会唤醒主线程,底层使用的是AQS的releaseShared()
  countDown()方法详细流程:
  参考文章:CountDownLatch原理与应用:https:juejin。cnpost6900368854472458248二、CyclicBarrier:1、什么是CyclicBarrier:
  CyclicBarrier,循环栅栏,通过CyclicBarrier可以实现一组线程之间的相互等待,当所有线程都到达屏障点之后再执行后续的操作。通过await()方法可以实现等待,当最后一个线程执行完,会使得所有在相应CyclicBarrier实例上的等待的线程被唤醒,而最后一个线程自身不会被暂停。
  CyclicBarrier没有像CountDownLatch和ReentrantLock使用AQS的state变量,它是直接借助ReentrantLock加上Condition等待唤醒的功能进而实现的。在构建CyclicBarrier的时候,传入的值会赋值给CyclicBarrier内部维护的变量count,同时也会赋值给parties变量(这是可以复用的关键)。
  线程调用await()表示线程已经到达栅栏,每次调用await()时,会将count减一,操作count值是直接使用ReentrantLock来保证线程安全性的,如果count不为0,则添加到condition队列中,如果count等于0,则把节点从condition队列中移除并添加到AQS队列中进行全部唤醒,并且将parties的值重新赋值给count从而实现复用。2、CyclicBarrier的源码分析:
  (1)成员变量:同步操作锁privatefinalReentrantLocklocknewReentrantLock();线程拦截器privatefinalConditiontriplock。newCondition();每次拦截的线程数privatefinalintparties;换代前执行的任务privatefinalRunnablebarrierCommand;表示栅栏的当前代privateGenerationgenerationnewGeneration();计数器privateintcount;静态内部类GenerationprivatestaticclassGeneration{booleanbrokenfalse;}
  CyclicBarrier是通过独占锁实现的,底层包含了ReentrantLock对象lock和Condition对象trip,通过条件队列trip来对线程进行阻塞的,并且其内部维护了两个int型的变量parties和count:parties表示每次拦截的线程数,该值在构造时进行赋值,用于实现CyclicBarrier的复用;count是内部计数器,它的初始值和parties相同,以后随着每次await方法的调用而减1,直到减为0就将所有线程唤醒。
  CyclicBarrier有一个静态内部类Generation,该类的对象代表栅栏的当前代,利用它可以实现循环等待,当count减为0会将所有阻塞的线程唤醒,并设置成下一代。
  barrierCommand表示换代前执行的任务,在唤醒所有线程前可以通过barrierCommand来执行指定的任务
  (2)await()方法:
  CyclicBarrier类最主要的功能就是使先到达屏障点的线程阻塞并等待后面的线程,其中它提供了两种等待的方法,分别是定时等待和非定时等待。非定时等待publicintawait()throwsInterruptedException,BrokenBarrierException{try{returndowait(false,0L);}catch(TimeoutExceptiontoe){thrownewError(toe);}}定时等待publicintawait(longtimeout,TimeUnitunit)throwsInterruptedException,BrokenBarrierException,TimeoutException{returndowait(true,unit。toNanos(timeout));}
  BrokenBarrierException表示栅栏已经被破坏,破坏的原因可能是其中一个线程await()时被中断或者超时。
  可以看到不管是定时等待还是非定时等待,它们都调用了dowait()方法,只不过是传入的参数不同而已,下面我们就来看看dowait()方法都做了些什么。核心等待方法privateintdowait(booleantimed,longnanos)throwsInterruptedException,BrokenBarrierException,TimeoutException{显示锁finalReentrantLocklockthis。lock;lock。lock();try{finalGenerationggeneration;检查当前栅栏是否被打翻if(g。broken){thrownewBrokenBarrierException();}检查当前线程是否被中断if(Thread。interrupted()){如果当前线程被中断会做以下三件事1。打翻当前栅栏2。唤醒拦截的所有线程3。抛出中断异常breakBarrier();thrownewInterruptedException();}每次都将计数器的值减1intindexcount;计数器的值减为0则需唤醒所有线程并转换到下一代if(index0){booleanranActionfalse;try{唤醒所有线程前先执行指定的任务finalRunnablecommandbarrierCommand;if(command!null){command。run();}ranActiontrue;唤醒所有线程并转到下一代nextGeneration();return0;}finally{确保在任务未成功执行时能将所有线程唤醒if(!ranAction){breakBarrier();}}}如果计数器不为0则执行此循环for(;;){try{根据传入的参数来决定是定时等待还是非定时等待if(!timed){trip。await();}elseif(nanos0L){nanostrip。awaitNanos(nanos);}}catch(InterruptedExceptionie){若当前线程在等待期间被中断则打翻栅栏唤醒其他线程if(ggeneration!g。broken){breakBarrier();throwie;}else{若在捕获中断异常前已经完成在栅栏上的等待,则直接调用中断操作Thread。currentThread()。interrupt();}}如果线程因为打翻栅栏操作而被唤醒则抛出异常if(g。broken){thrownewBrokenBarrierException();}如果线程因为换代操作而被唤醒则返回计数器的值if(g!generation){returnindex;}如果线程因为时间到了而被唤醒则打翻栅栏并抛出异常if(timednanos0L){breakBarrier();thrownewTimeoutException();}}}finally{lock。unlock();}}
  上面执行的代码相对比较容易看懂,我们再来看一下执行流程:
  执行dowait()方法时,先获得显示锁,判断当前线程状态是否被中断,如果是,则执行breakBarrier()方法,唤醒之前阻塞的所有线程,并将计数器重置,否则,往下执行;计数器count减1,如果count0,表示最后一个线程达到栅栏,接着执行之前指定的Runnable接口,同时执行nextGeneration()方法进入下一代;否则,进入自旋,判断当前线程是进入定时等待还是非定时等待,如果在等待过程中被中断,执行breakBarrier()方法,唤醒之前阻塞的所有线程;判断是否是因为执行breakBarrier()方法而被唤醒,如果是,则抛出异常;判断是否是正常的换代操作而被唤醒,如果是,则返回计数器的值;判断是否是超时而被唤醒,如果是,则唤醒之前阻塞的所有线程,并抛出异常;释放锁。
  (3)breakBarrier()方法:privatevoidbreakBarrier(){generation。brokentrue;栅栏被打破countparties;重置counttrip。signalAll();唤醒之前阻塞的线程}
  (4)nextGeneration()方法:privatevoidnextGeneration(){唤醒所以的线程trip。signalAll();重置计数器countparties;重新开始generationnewGeneration();}
  (5)reset()方法:重置barrier到初始状态,所有还在等待中的线程最终会抛出BrokenBarrierException。publicvoidreset(){finalReentrantLocklockthis。lock;lock。lock();try{breakBarrier();breakthecurrentgenerationnextGeneration();startanewgeneration}finally{lock。unlock();}}
  参考文章:CyclicBarrier原理与使用:https:juejin。cnpost6900548129645395982三、Semaphore:1、什么是Semaphore:
  Semaphore信号量,主要用于控制并发访问共享资源的线程数量,底层基于AQS共享模式,并依赖AQS的变量state作为许可证permit,通过控制许可证的数量,来保证线程之间的配合。线程使用acquire()获取访问许可,只有拿到许可证后才能继续运行,当Semaphore的permit不为0的时候,对请求资源的线程放行,同时permit的值减1,当permit的值为0时,那么请求资源的线程会被阻塞直到其他线程释放访问许可,当线程对共享资源操作完成后,使用release()归还访问许可。不同于CyclicBarrier和ReentrantLock,Semaphore不会使用到AQS的Condition条件队列,都是在CLH同步队列中操作,只是当前线程会被park。另外Semaphore是不可重入的。2、Semaphore的公平和非公平两种模式:
  Semaphore通过自定义两种不同的同步器(FairSync和NonfairSync)提供了公平和非公平两种工作模式,两种模式下分别提供了限时不限时、响应中断不响应中断的获取资源的方法(限时获取总是及时响应中断的),而所有的释放资源的release()操作是统一的。公平模式:遵循FIFO,调用acquire()方法获取许可证的顺序时,先判断同步队列中是不是存在其他的等待线程,如果存在就将请求线程封装成Node结点加入同步队列,从而保证每个线程获取同步状态都是按照先到先得的顺序执行的,否则对state值进行减操作并返回剩下的信号量非公平模式:是抢占式的,通过竞争的方式获取,不管同步队列中是否存在等待线程,有可能一个新的获取线程恰好在一个许可证释放时得到了这个许可证,而前面还有等待的线程。
  框架流程图如下:
  3、尝试获取资源acquire()方法的执行流程图:
  参考文章:Semaphore源码解析:https:juejin。cnpost6899744477427007495
  作者:张维鹏
  来源:blog。csdn。neta745233700articledetails120688546
  点击关注,带你了解更多

5999元手慢无!motorazr2022再次开售首销5分钟8月14日消息,今日,摩托罗拉手机官方宣布,motorazr2022将在8月16日上午10:00再次开售,8128GB版5999元、8256GB版6499元、12512GB版7……高峰足校启动,国安功勋国足中国女足国脚送祝福!看看都有谁?那英前夫高峰足校启动,中超国安功勋国足中国女足国脚送祝福!看看都有谁?提到中国足球职业化初期的当红球星,快马高峰的影响力绝对可以排进前五名。有着浪子之称的高峰是速度和技巧……脾虚的人多因肝郁,一张方子,可健中焦之脾胃,解下焦之肝郁前几天有个患者说,他每次一生气就会导致原来就胃病发作,是不是生气会导致胃病?其实这是有依据的!因为从中医的理论来讲,情绪方面的影响,就容易出现肝郁的现象,肝郁就会引……保姆带娃的隐患大,至少一半的男孩和三分之一的女孩容易人格分裂事实证明,在幼年时期缺少关爱的人自我意识较为薄弱,会因人情淡薄而遭受生理和心理上的双重创伤。他们嗜睡、懒散,缺乏最基本的社交和心智技能,并且十分容易生病,这些症状被称为就医综合……乐游麻城龟峰山,邂逅25度的夏天,还有超多新奇项目高楼掩没了城市喧闹扰乱了心神酷热弥漫着角落浮躁充斥着人心久居都市清风不肯来烈日不肯暮此时的你或许该来夏季均温23的麻城龟峰山观山色、枕……美媒列出了202223赛季30支球队最强的首发阵容实力排名随着选秀,自由球员,甚至一些球队阵容改造和交易的结束,是时候评估202223赛季开始时30支球队阵容中最强的首发五人了。我们离下个赛季开始还有三个月的时间,但是在我们等待的时候……吴龑在他乡的日子并不香,河南球迷希望飞龙早日出状态上一场中超比赛,曾经吴龑的替补王国明成为了球队获胜的最大功臣,让河南球迷更加坚信国明上赛季惊艳的状态并不是昙花一现,成功逆袭之后,王国明让吴龑感到压力转投陕西长安竞技。而这个赛……旅行攻略行走在坝上草原天路我行走在葱郁辽阔的草原上,不为转山猎水,只为途中与你相逢。。。对对鸿雁头顶飞过,那一刻你听见了我的呼唤,回荡在碧色的草原,幸福便来自这多情的土地。坝上一个充满豪情与诗意的……东风EX1PRO这款车前景怎么样东风集团旗下轻纯电专注者东风EV新能源以一款东风EX1PRO车型打开市场,成了新能源代步车型中的新兴力量。2022年汽车市场迎来前所未有的上游原材料大幅上涨、补贴退坡和生产困境……伊能静与婆婆关系很好!同时现身机场,婆婆打扮还挺潮婆媳关系一直都是一部分人的困扰,伊能静与秦昊走进婚姻的殿堂,并没有出现严重的婆媳关系,但也没想到伊能静与婆婆的关系会特别好,同时现身机场,伊能静装扮得像个大学生,看起来元气感满……幻西游火区玩法开区第4天,学会抓鬼能省不少眼49级第一个鬼,给3750的钱。是不是觉得很少没意思?可在比例1000的时候,这就是3毛钱,一组号就是1。5元。一轮就是20元。49级抓一轮鬼,也就是40分钟的事。7个小时就是……22岁出名,退圈抗癌10年,39岁一夜爆红她的故事,藏不住了最近一首游戏歌曲《孤勇者》,征服了众多10后,甚至引得小学生在校园集体合唱。连一向沉默寡言的歌神陈奕迅,都忍不住发微博,怀疑自己新上线了一首儿歌。孩子们之所以被这首……
热乎乎暄腾腾,不起眼但花样多,你爱哪一个还记得小时候,回爷爷奶奶家吃饭,经常会看到大人们围着案板有说有笑。他们有人负责揉面,有人负责擀面,有人负责把一个个揪下来的面团子变个花样,面团就变成了各种不同的馍,有圆的、有三……跨年文案辞暮尔尔,烟火年年头条创作挑战赛1。新年所愿,四季与你一起。2。今年的遗憾留在今年就好。3。新的剧本以爱自己为主。4。愿今年所有的遗憾,是为了明年更好的铺垫。5。年……阿伦森哈兰德渴望进球,没有太多球员像他一样直播吧12月29日讯在今日凌晨结束的一场英超联赛中,利兹联13不敌曼城。赛后在接受BBC采访时,利兹联中场阿伦森表示,上半场结束前的丢球是一个很大的打击。阿伦森这样谈道:……张杰无奈透漏身份转变导致必须要进家长群还得接龙引众人爆笑讨论张杰自从跟谢娜结婚后一直很低调,基本除了帮自家老婆录节目以外,就很少在其他节目露面了!一心一意的做自己的歌唱事业!最近他受邀约参加综艺《office4》,无奈透漏身份转变导致从……小米万兆路由器体验战未来的超强接口配置老实说,在现在这个时间节点,对于旗舰的顶配路由器,无论是消费者打算购买,还是厂商的产品开发,都会让人感到些许犹豫的意思。毕竟自年初以来,就有WiFi7路由将要推出的消息,全新的……708km超长真续航,换购一台极狐阿尔法S有多香随着技术发展,新能源汽车正加速迭代,续航更长、配置更高、体验更好的新产品层出不穷,不过,很多想换新车的纯电车车主却在犯难,二手车残值低卖不起、车商不愿意收没人买。近日,北汽新能……一周十大汽车要闻2022。11。28蔚来将推旅行版,马自达致上半年十大爆款新能源车本周要闻:11月23日,受新能源汽车购置补贴政策终止及电池原材料价格上涨的影响,比亚迪官方宣布将对王朝、海洋及腾势相关新能源车型的官方指导价进……安徽省2022年第二批重点项目03亳州47项各项目简况(三)亳州市。序号(246302)。项目名称;行业类别;建设地点;建设规模及内容;总投资;2022年计划投资;项目进展情况;2022年工作目标;项目单位;牵头协调推进责任……英雄联盟出一个连普通攻击都是非指向性的英雄,该如何设计?可以参考王者荣耀的设计做一做吧,英雄联盟是一款具有非常漂亮的游戏设计的竞技游戏。在游戏中,大多数英雄具有四种主动技能和一种被动技能。被动技能不会被主动使用,并且会在您打架时通过……景甜御姐吊带长裙性感穿搭,风格甜中带酷,这气质谁能拒绝景甜,一个长相甜美的姑娘。就像她的名字一样,总是给人甜甜的感觉。她的五官非常的优雅大气,有一种大家闺秀的美感。而且在穿搭上,景甜也是颇有心得。不仅身材比例优越,穿搭品味更是令人……中超0终结浙江14轮不败北京时间11月3日,中超第23轮,浙江队对阵深圳队。上半场浙江队占据着优势,主导进攻,但是深圳队在21分钟和23分钟短时间抓住对方防线的失误连进两球,瞬间奠定了优势,随后浙江队……马鞍山市的区划变动,安徽省的重要城市之一,为何有6个区县?在之前的文章中,作者和大家聊了一系列关于我国安徽省各个城市经济发展和区划变迁的故事,例如亳州市、阜阳市、芜湖市等等。今天,我们聊聊安徽省的马鞍山市。马鞍山市是安徽省下辖的地级市……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网