Learning Java Concurrency - CyclicBarrier

CyclicBarrier,正如同名字里面表达出来的,是一个可以循环使用的屏障。与CountDownLatch类似,它可以用来表达等待某个状态,比如大家都到齐了,那么开始开会吧。与CountDownLatch不同的是,它可以多次等待,也就是可以等待多个状态。

好吃不过栗子。比如哈利波特的三强争霸赛,要一项一项任务地完成,大家都结束了(不管成功还是失败),才开始计划下一个任务。第一个是去挑战龙;然后是到海里面挑战人鱼群;最后是挑战伏地魔。每一个任务总是要等大家都完成了才开始。

还有一个栗子。大家一起去面试,有的公司为了省事,等凑齐了一波人才开始走流程。HR领着大家一起先笔试,然后安排初面官,然后安排复试官。每一关刷掉一波人,但是只有大家都结束了才进行下一轮。别问我哪里有这样的招聘部门,人家开心就好。

Learning Java Concurrency - CountDownLatch

CountDownLatch 是一种比较有意思的线程同步方法,主要用于需要同步启动的环境中。

举个栗子,部门进行聚餐要等到大家都到齐了才能开动。这个时候CountDownLatch可以理解为“还有多少人没有到”这个东西,来了一个,这个东西的值就会减1。一直到人都到齐了,这个东西的值变为了0,也就是可以开吃了。

举个栗子,通用的make进行多工程代码编译,必须所有工程编译完了才能结束。

举个栗子,项目上线,各个模块都上线完了,leader说一句OK,大家才能走。

要注意以上几个栗子都是每个线程减1,但是实际中具体减多少不做限制。

比如,猫有9条命,两个人你一下我一下一刀一刀砍上去,然后它就死了。这个也可用CountDownLatch来描述。

Learning Java Concurrency - Semaphore

Semaphore,信号量。信号量可以理解为令牌掌牌使,负责令牌的发放;当线程需要执行任务时,先到信号量处领取令牌,领取到了令牌再去执行任务;如果令牌被领光了,就需要一直等待;如果任务执行完了,需要到信号量处交还令牌。很简单的逻辑!

还是吃个栗子,地铁里面公厕,一般也就3、4个坑位。人有三急,当你有需要的时候,还必须得靠这个解决。这个时候,如果公厕里没有人,或者还剩最后一个坑位,那就啥也别说了,进去吧。但是,如果,满了。就,只有,等,了。不着急可以等一等;实在憋不住的,可以催一催。但是不管急不急,都要等里面随便一个里面出来人了才能进去。这个就是典型的信号量。

还有就是非常典型的生产者/消费者问题了。有一个仓库,里面的仓位是有限的。生产者只有当仓库里面有空仓位时才能进行生产;如果没有空仓位,则需要等待;如果生产了一次,则仓库少了一个空仓位。消费者只有当仓库里有非空仓位时才能消费;如果没有非空仓位,就需要等待;如果消费了一次,仓库里多了一个空仓位。