AtomicInteger源码分析

前言

  AtomicInteger使得在高并发的场景下,可以安全的操作整数的增减。主要原理是采用Unsafe.CAS操作。

原子操作类

  多线程同时对int i进行操作,可能导致原子性问题。
  可以加Synchronized悲观锁解决,考虑到性能问题,JDK1.5后,J.U.C包提供Atomic包 → 对常用数据结构做原子操作。
  J.U.C中的原子操作类有:

  • 原子基本类型
    • AtomicBoolean、 AtomicInteger、 AtomicLong
  • 原子数组
    • AtomicIntegerArray 、 AtomicLongArray 、AtomicReferenceArray
  • 原子引用
    • AtomicReference 、 AtomicReferenceFieldUpdater 、AtomicMarkableReference(更新带有标记位的引用类型)
  • 原子字段
    • AtomicIntegerFieldUpdater、 AtomicLongFieldUpdater、AtomicStampedReference

AtomicInteger源码分析

  接下来,我们一起来看AtomicInteger源码:

getAndIncrement方法

  调用Unsafe类中的方法。
  Unsafe类相当于Java的后门,使得Java可以像C语言一样直接操作内存空间。当然也会带来弊端 → 指针问题。除了J.U.C包外,Netty、Kafka也使用这个类。这个类提供了很多功能,包括:多线程同步(monitorEnter)、CAS操作(compareAndSwap)、线程的挂起和恢复(park/unpark)、内存屏障(loadFence/storeFence)、内存管理(内存分配、释放内存、获取内存地址等)。

	public final int getAndIncrement() {
        return unsafe.getAndAddInt(this, valueOffset, 1);//每次增加1
    }

  valueOffset → 当前Value变量在内存中的偏移量

 	private static final long valueOffset;

    static {
        try {
            valueOffset = unsafe.objectFieldOffset
                (AtomicInteger.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }
Unsafe.getAndAddInt
	public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
        	//从主内存中获取当前value
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

get方法

  get()只需要返回value值就行,这里的value是通过volatile修饰的。

	public final int get() {
        return value;
    }

compareAndSet方法

  compareAndSet()允许客户端基于AtomicInteger实现乐观锁操作。

	public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }
AtomicInteger类型比较是通过调用equals()方法进行的。不同于Integer类型的比较,AtomicInteger类型的equals()方法比较的是引用地址而不是值本身。所以,即使两个AtomicInteger对象的值相等,它们的equals()方法也会返回false。例如,对于两个AtomicInteger对象atomicInteger1和atomicInteger2,即使它们的值都是1,但atomicInteger1.equals(atomicInteger2)的结果将是false。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [AtomicInteger子类、判空工具类、比较时间大小](https://blog.csdn.net/qq453660983/article/details/125279288)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [java并发之AtomicInteger源码分析](https://download.csdn.net/download/weixin_38606076/12749202)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [切忌用equal比较AtomicInteger类型](https://blog.csdn.net/xu962336414/article/details/101688721)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值