闭锁:延迟线程的进度,直到其到达终止状态算法
1:就像是一道门初始状态大门一直是关闭的,在达到结束状态以前,这扇门将会打开,此时容许全部的线程经过,达到结束状态后将不会再改变,数据库
做用:确保某些活动直到其它活动都执行完毕后再执行安全
例如: 1确保某个计算在须要的资源被初始化以后再执行,此时叫作二元闭锁ui
2:确保某个服务在其依赖的服务启动完成以后再启动spa
Future:,也是一种闭锁的实现方式,表示一种可生成抽象结果的运算, FutureTask表示的计算是经过callable实现的,表示一种可生成结果的Runnable线程
处于三种状态:等待运行,正在运行,运行完成对象
Future.get//的行为取决于任务的状态,若是任务已经完成,那么get会当即返回,若是任务还未完成,get会一直阻塞,直到任务完成,或者抛出异常,索引
futureTask将执行计算的结果,从一个当前线程传递另外一个线程是线程安全的事件
CountingSemaphore计数信号量:用来控制某个特定资源的操做数量或者同时执行某个操做的数量资源
1:acquire将获取一个许可,若是此时没有足够的许可,那么此时
2:release将返回一个许可,给信号量
具有不可重入的加锁语意,谁拥有许可,谁就拥有了这个互斥锁
例如数据库链接池就是一种经常使用的用法,数据库链接池,当池中非空的时候,将能够得到链接,当池中为空时,此时请求资源会失败,此时但愿看到的是阻塞,当release释放许可给信号量的时候
此时但愿可以得到链接池。咱们可使用Semaphore,将任何一种容器变为有界容器,
闭锁是一次性对象,一旦进入就不能被重置
cycleBarrier:线程必须同时到达栅栏位置,才能继续执行,栅栏相似于闭锁他能阻塞一组线程直到等待事件发生,栅栏与闭锁的根本区别在于:栅栏用于等待一组线程,而闭锁用于等待一组事件
栅栏用于实现一些协议,例如几个家庭决定在某个地方集合,使参与数量的一方反复的在栅栏位置聚集,并行迭代算法中很是有用,这种算法一般将一个问题拆分红一系列的子问题,当线程到达时将
调用await方法,这个方法将阻塞全部线程到达栅栏位置,直到全部的线程都到达,此时栅栏将会打开,弱国线程被打断,此时全部的阻塞将会失效成功,此时await将会为每一个线程分配一个索引号
咱们能够利用这个索引来产生一个领导线程,并利用这个领导线程在下个迭代中,执行以一些特殊的工做。