• 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);
    }
  • 相关阅读:
    EF 学习代码
    VS10 调试 新功能
    高级编程 实验代码
    事务 代码
    ADO.NET的新功能:MARS(Multiple Active Result Set) 及 异步执行命令
    Log4Net
    获得CheckBoxList最后一个被操作的项
    在存储过程中用事务
    ASP.NET服务端添加客户端事件
    GridView遍历各行的控件和控件事件
  • 原文地址:https://www.cnblogs.com/shamo89/p/8126266.html
Copyright © 2020-2023  润新知