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