zoukankan      html  css  js  c++  java
  • AtomicInteger类的使用

    AtomicInteger介绍

    AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减。

    AtomicInteger使用场景

    AtomicInteger提供原子操作来进行Integer的使用,因此十分适合高并发情况下的使用。

    AtomicInteger源码部分讲解

    public class AtomicInteger extends Number implements java.io.Serializable {
        private static final long serialVersionUID = 6214790243416807050L;
    
        // setup to use Unsafe.compareAndSwapInt for updates
        private static final Unsafe unsafe = Unsafe.getUnsafe();
        private static final long valueOffset;
    
        static {
            try {
                valueOffset = unsafe.objectFieldOffset
                    (AtomicInteger.class.getDeclaredField("value"));
            } catch (Exception ex) { throw new Error(ex); }
        }
    
        private volatile int value;

    这里, unsafe是java提供的获得对对象内存地址访问的类,注释已经清楚的写出了,它的作用就是在更新操作时提供“比较并替换”的作用。实际上就是AtomicInteger中的一个工具。

    valueOffset是用来记录value本身在内存的编译地址的,这个记录,也主要是为了在更新操作在内存中找到value的位置,方便比较。

    注意:value是用来存储整数的时间变量,这里被声明为volatile,就是为了保证在更新操作时,当前线程可以拿到value最新的值(并发环境下,value可能已经被其他线程更新了)。

    这里,我们以自增的代码为例,可以看到这个并发控制的核心算法:

    /**
    * Atomically increments by one the current value.
    *
    * @return the updated value
    */
    public final int incrementAndGet() {
    for (;;) {
    //这里可以拿到value的最新值
    int current = get();
    int next = current + 1;
    if (compareAndSet(current, next))
    return next;
    }
    }
    
    public final boolean compareAndSet(int expect, int update) {
    //使用unsafe的native方法,实现高效的硬件级别CAS
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }
  • 相关阅读:
    OpenGL编程 基础篇(七)对象的变换——用实心体绘制3D场景
    mysql在查询结果列表前添加一列递增的序号列(最简)
    将中文字符串分割为数组 解决str_split中文乱码php
    file_get_contents 抓取网页乱码。
    js下的sleep实现
    js获取当前时间(昨天、今天、明天)
    JPA为字段设置默认值
    js实现点击按钮弹出上传文件的窗口
    Bootstrap使用模态框modal实现表单提交弹出框
    springboot使用Freemarker继承
  • 原文地址:https://www.cnblogs.com/shamo89/p/8126266.html
Copyright © 2011-2022 走看看