zoukankan      html  css  js  c++  java
  • Phaser详解

    Phaser详解

    简介

    一种可重用的同步栅栏,功能与CyclicBarrierCountDownLatch类似.
    内部使用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也进入终止状态.

    参考:

  • 相关阅读:
    eclipse 工程没有build path
    Redis中RedisTemplate和Redisson管道的使用
    Spring多开发环境配置
    Commons Configuration之三Properties文件
    Commons Configuration之二基本特性和AbstractConfiguration
    Commons Configuration之一简介
    Commons DbUtils
    这可能是最容易入门的socket教程了
    图解leetcode —— 124. 二叉树中的最大路径和
    图解leetcode —— 395. 至少有K个重复字符的最长子串
  • 原文地址:https://www.cnblogs.com/truestoriesavici01/p/13235960.html
Copyright © 2011-2022 走看看