当前位置: 首页 > article >正文

jdk17-LongAddr 类increment()方法注释说明

increment() 方法如下:

    /**
     * Equivalent to {@code add(1)}.
     */
    public void increment() {
        add(1L);
    }

成员变量如下


    /** Number of CPUS, to place bound on table size */
    static final int NCPU = Runtime.getRuntime().availableProcessors();

    /**
     * Table of cells. When non-null, size is a power of 2.
     */
    transient volatile Cell[] cells;

    /**
     * Base value, used mainly when there is no contention, but also as
     * a fallback during table initialization races. Updated via CAS.
     */
    transient volatile long base;

    /**
     * Spinlock (locked via CAS) used when resizing and/or creating Cells.
     */
    transient volatile int cellsBusy;
    /**
     * 使用 VarHandle  对实例的属性进行CAS操作
     */
    final boolean casBase(long cmp, long val) {
        return BASE.weakCompareAndSetRelease(this, cmp, val);
    }
	private static final VarHandle BASE;
    private static final VarHandle CELLSBUSY;
    private static final VarHandle THREAD_PROBE;
    static {
        try {
            MethodHandles.Lookup l = MethodHandles.lookup();
            BASE = l.findVarHandle(Striped64.class,
                    "base", long.class);
            CELLSBUSY = l.findVarHandle(Striped64.class,
                    "cellsBusy", int.class);
            l = java.security.AccessController.doPrivileged(
                    new java.security.PrivilegedAction<>() {
                        public MethodHandles.Lookup run() {
                            try {
                                return MethodHandles.privateLookupIn(Thread.class, MethodHandles.lookup());
                            } catch (ReflectiveOperationException e) {
                                throw new ExceptionInInitializerError(e);
                            }
                        }});
            THREAD_PROBE = l.findVarHandle(Thread.class,
                    "threadLocalRandomProbe", int.class);
        } catch (ReflectiveOperationException e) {
            throw new ExceptionInInitializerError(e);
        }
    }

探测线程的hash值,如果threadLocalRandomSeed 初始化了,那么该值就非0

    int threadLocalRandomProbe;

add() 方法如下:

    /**
     * Adds the given value.
     *
     * @param x the value to add
     */
    public void add(long x) {
        Cell[] cs; long b, v; int m; Cell c;
        /**
	     * 这里优先判断了cell数组是否为空,
	     * 之后才判断base字段的cas累加
	     * 意味着如果线程不发生竞争,cell数组一直为空,那么所有的累加操作都会累加到base上
	     * 而一旦发生过一次竞争导致cell数组不为空,那么所有的累加操作都会优先作用于数组中的对象上
	     */
        if ((cs = cells) != null || !casBase(b = base, b + x)) {
        	// 获取线程的hash值,如果threadLocalRandomSeed 初始化了,那么该值就非0
            int index = getProbe();
            /**
	         * 这个字段是用来标识在对cell数组中的对象进行累加操作时是否发生了竞争
	         * 如果发生了竞争,那么在longAccumulate方法中会多进行一次rehash的自旋
	         * 这个在后面的方法中详细说明,这里先有个印象
	         * true表示未发生竞争
	         */
            boolean uncontended = true;
            // 如果cell数组为空或者长度为0则直接进入主逻辑方法
            if (cs == null || (m = cs.length - 1) < 0 ||
            	/**
                 * 这里的index 是线程的hash值
                 * hash值与(数组长度-1)进行位与操作后得到对应的数组下标
                 * 判断该元素是否为空,如果不为空那么就会尝试累加
                 * 否则进入主逻辑方法
                 */
                (c = cs[index & m]) == null ||
                /**
                 * 对数组下标的元素进行cas累加,如果成功了,那么就可以直接返回
                 * 否则进入主逻辑方法
                 */
                !(uncontended = c.cas(v = c.value, v + x)))
                longAccumulate(x, null, uncontended, index);
        }
    }

http://www.kler.cn/a/411650.html

相关文章:

  • 数据结构 (6)栈的应用举例
  • CANopen多电机控制的性能分析
  • XG(S)-PON原理
  • 前端适配:常用的几种方案
  • 宇信科技JAVA笔试(2024-11-26日 全部AK)
  • 商业物联网:拥抱生产力的未来
  • c++中的lambda表达式!
  • 【H2O2|全栈】JS进阶知识(十一)axios入门
  • ChatGPT如何辅助academic writing?
  • 学习路之linux--多php版本下指定php版本执行命令
  • 基于Java Springboot华为数码商城交易平台
  • 数据结构初阶---复杂度
  • 大模型的实践应用31-基于通义千问大模型改进台风和海浪预测研究,利用机器学习与通义千问结合的思路实现对台风和海浪预测分析
  • Mongo数据库 --- Mongo Pipeline
  • 量子安全与经典密码学:一些现实方面的讨论
  • 分布式在线评测系统
  • 【机器视觉 OCR】适合Python开发的OCR工具:深入解析与实战应用
  • Python学习34天
  • 在Unity中实现物体动画的完整流程
  • HTTP 管道传输与多路复用
  • 数据结构与算法学习笔记----队列
  • 大数据面试SQL题-笔记02【查询、连接、聚合函数】
  • 大语言模型---Llama不同系列的权重参数文件提取;Llama-7B权重文件提取;Llama-8B权重文件提取;主要代码功能解析
  • (已解决)wps无法加载此加载项程序mathpage.wll
  • 音视频技术扫盲之预测编码的基本原理探究
  • 基于Matlab扩展卡尔曼滤波的主从导航系统传递对准仿真与优化研究