• 中文
    • English
  • 注册
  • 查看作者
  • 深入理解Metrics(二):Counters

    1. Counters的使用 

    在account模块内部使用Counters统计异常发生的次数,一段时间内超过预置阀值会触发报警。

    下面的一段代码是 account用来检测用户登录失败发生的次数

    2. Counter 层级结构

    深入理解Metrics(二):Counters

    Counter内部通过持有LongAdderAdapter的实例来实现Counting接口,而LongAdderAdapter内部依赖的是JDK1.8并发原子操作的LongAdder。

    那么Counter是 如何获取到LongAdderAdapter的实例 呢?

    深入理解Metrics(二):Counters

    3. LongAdder 工作原理

    通过上面的创建和适配过程,并发原子操作最终交由LongAdder类完成,下面让我们来研究下LongAdder类的处理流程。

    深入理解Metrics(二):Counters

    工作流程说明:

    1. LongAdder继承Striped64类,Striped64使用不安全的Unsafe类来进行原子操作。

    2. LongAdder最核心的就是 add(long x) 方法,不管自增和自减都会调用此方法。 

    3. add方法基于base的CAS操作返回值来验证是否发生并发。 

    4. 未发生并发:后续的原子操作、返回值都是基于base。

    5. 发生并发:通过Cell数组将原子操作分散到子项中进行,Cell是Striped64的内部类,里面有存储long值的value字段。 

    6. Cell数组的索引:依赖与当前线程的threadLocalRandomProbe。

    获取偏移量的代码解析:

    深入理解Metrics(二):Counters

    是否发生了并发操作:

    深入理解Metrics(二):Counters

    实际的并发操作:

    深入理解Metrics(二):Counters

    4. 结束语 

    Java除了并发包,还有很多集合类也是是Doug Lea编写的,通过本章对Counters的讲解,相信你一定会有所收获。

    深入理解Metrics(二):Counters

  • 0
  • 0
  • 0
  • 39
  • 请登录之后再进行评论

    登录
  • 任务
  • 实时动态
  • 发布
  • 单栏布局 侧栏位置: