• juc原子类之二:基本类型原子类AtomicInteger(AtomicLong、AtomicBoolean)


    一、AtomicInteger简介

    AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似。以AtomicInteger对基本类型的原子类进行介绍。

    二、AtomicInteger源码分析

    2.1、类图结构

    2.2、数据结构

    2.3、AtomicInteger中的lock

    使用Unsafe的cas。

    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; //注意value变量的volatile属性

    功能说明:
    1、获取Unsafe对象
    2、valueOffset是通过反射获取AtomicInteger类中value在内存中的位置。

    接着看cas调用:

    public final boolean compareAndSet(int expect, int update) {   
           return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

    功能:
    通过CAS算法,设置value的值。CAS算法就是先比较value的值和expect的值是否相同,如果相同就设置update。如果不相同则设置失败。

    注意下,上面对value值修改时,是通过value的valueOffset来进行的。这样就保证了,对value的原子操作。

    2.4、成员变量

        private static final Unsafe unsafe;
        private static final long valueOffset;
        private volatile int value;

    2.5、构造函数

        public AtomicInteger(int i)
        {
            value = i;
        }

    2.6、赋值元素

        public final void set(int i)
        {
            value = i;
        }

    2.7、查询元素

        public final int get()
        {
            return value;
        }

    2.8、自增自减

        public final int incrementAndGet()
        {
            return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
        }
    
        public final int decrementAndGet()
        {
            return unsafe.getAndAddInt(this, valueOffset, -1) - 1;
        }

    三、JDK或开源框架中使用


    LinkedBlockingQueue中队列元素的总数量是用AtomicInteger来存储的。

    四、示例

  • 相关阅读:
    【问题】SUSE已经安装了libsodium,安装zeromq时出现下面的错误?
    将博客搬至CSDN
    iOS开发之self.abc = nil与[_abc release]的区别
    Swift编程语言入门教程
    如何使用NSData处理数据
    集合之間的轉換
    數組排序
    集合类的用法总结(NSArray、NSDictionary、NSSet)
    NSString的各种用法总结(创建、截取、判断比较、转化数据类型、拼接、替换、添加、追加、读取、写入、删去、改变)
    instancetype和id的区别
  • 原文地址:https://www.cnblogs.com/duanxz/p/3463385.html
Copyright © 2020-2023  润新知