Phaser详解
Posted truestoriesavici01
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Phaser详解相关的知识,希望对你有一定的参考价值。
Phaser详解
简介
一种可重用的同步栅栏,功能与CyclicBarrier
和CountDownLatch
类似.
内部使用CAS操作保证原子性.
运行机制
注册机制
- Phaser中注册的同步者(parties)会随着时间的变化而变化.
- Phaser可通过构造器初始化parties个数,也可以在运行期间随时加入(register)新的parties,以及在运行期间注销(deregister)parties.
- 注册和注销只会影响Phaser内部的计数器,任务不能查询自己是否已经注册.
- CyclicBarrier和CountDownLatch需在初始化时设定同步者的个数,运行时无法修改.
同步机制
- Phaser的每个周期(generation)都有一个phase值,从0开始计数.
- 当所有的已注册的parties到达(arrive)后,该phase会自增.
- phase到达Integer.MAX_VALUE后继续从0开始.
- phase表示当前parties所处的阶段.
- 用来控制线程等待唤醒的时机.
到达机制(arrive)
arrive()
和arriveAndDeregister()
不会阻塞线程,直接返回对应的phase值.- 当前phase最后一个线程到达时,phase会自增.同时触发
onAdvance
方法,释放所有阻塞在phase的线程.
等待机制(wait)
awaitAdvance()
需要指定一个phase,表示线程阻塞到当前phase到达指定的周期.arriveAndAwaitAdvance()
:阻塞线程直到当前phase结束.- 当前的线程被中断时,
awaitAdvance()
继续等待.
中断机制
- 当Phaser被终止时,所有的同步方法立即返回一个负的phase值.
- 向一个终止的Phaser注册不会生效.
onAdvance()
返回true,表示所有的parties都已注销.
分层(Tiering)
- 通过分层降低竞争.
- 一个Phaser有大量的parties会导致严重的同步竞争.
- 可以将多个parties分组共享parent Phaser,提高吞吐量.
- 当Child Phaser的parties非0时,其会注册到Parent Phaser.
- 当Child Phaser的parties为0时,会从Parent Phaser注销.
监控机制
- 监控方法并非同步,只能反映当前瞬间的状态.
getRegisteredParties()
:获取已注册的parties个数.getPhase()
获取当前phase周期数.
方法解释
状态
Phaser内有两个状态:
phase
:当前的阶段,初始值为0,当所有线程完成本轮任务,同时开启下一轮任务时,phase值加1.party
:当前Phaser对象管理的线程数.
方法
一个可以重载的方法:onAdvance(int phase, int registeredParties)
.
作用:
- 当每个阶段执行完毕后,此方法被自动调用.
- 此方法返回true表示Phaser被终止.(返回值用来终止所有线程)
arriveAndAwaitAdvance()
表示当前线程完成当前阶段的任务,等待其他线程完成当前阶段的任务.
若当前线程为本阶段中最后一个到达的,则直接返回下一个阶段的序号,并且其他线程也返回下一个阶段的序号.
arriveAndDeregister()
当前线程立即返回下一阶段的序号,并且从Phaser中移出当前线程,其他线程在调用arriveAndAwaitAdvance()
时不需要等待当前线程.
arrive()
不等待,直接返回下一个阶段的序号.
awaitAdvance(int phase)
该方法等待某一阶段执行完毕.
若当前阶段不等于指定的阶段或该Phaser已被终止,则立即返回.
- 若参数为负,则直接返回指定的参数.
- 若Phaser已被终止,则返回当前阶段的序号.
- 否则返回下一个阶段的序号.
awaitAdvanceInterruptibly(int phase)
方法等待过程中被中断则抛出异常.
bulkRgister(int parties)
注册多个party.
- 若当前Phaser被终止,则方法无效,返回负数.
- 若
onAdvance()
正在执行,则等待其执行完毕. - 若父Phaser指定的party大于0,而此Phaser的party为0,则该Phaser被注册到父Phaser中.
forceTermination()
强制该Phaser进入终止状态.
已注册的party不受影响.
子Phaser也进入终止状态.
参考:
以上是关于Phaser详解的主要内容,如果未能解决你的问题,请参考以下文章