首页 > 其他分享 >AtomicInteger

AtomicInteger

时间:2023-06-22 23:24:57浏览次数:35  
标签:get ai AtomicInteger int new public

众所周知,AtomicInteger用于多线程下线程安全的数据读写操作,避免使用锁同步,底层采用CAS实现,内部的存储值使用volatile修饰,因此多线程之间是修改可见的。

1. 构造

public AutomicInteger(int initValue): 有参构造,初始化为initValue

public AutomicInteger(): 无参构造,相当于AutomicInteger(0)

2. 自增1

public int getAndIncrement(): 返回当前值,并自增1

AtomicInteger ai = new AtomicInteger(5);

ai.getAndIncrement(); *// 5*
ai.get(); // 6

public int incrementAndGet(): 先自增1,再返回自增后的值

AtomicInteger ai = new AtomicInteger(5);
ai.incrementAndGet(); *// 6*
ai.get(); // 6

3. 自减1

public int getAndDecrement(): 返回当前值,并自减1

AtomicInteger ai = new AtomicInteger(5);

ai.getAndDecrement(); // 5
ai.get(); // 4

public int decrementAndGet(): 自减1, 返回自减后的值

AtomicInteger ai = new AtomicInteger(5);

ai.decrementAndGet(); // 4
ai.get(); // 4

4. 如果原来是A,则更新成B

public boolean compareAndSet(int source, int dest):source是改之前的值,Dest是改之后的值,source与当前真实值匹配了才能执行成功,返回值表示是否执行成功。

AtomicInteger ai = new AtomicInteger(10);

ai.compareAndSet(100, 12); // false, 因为改之前不是100
ai.get(); // 10

ai.compareAndSet(10, 12); // true

ai.get(); // 12

5. 自增/自减N

public int getAndAdd(int delta): 先获取当前值,再进行计算val = val + delta

AtomicInteger ai = new AtomicInteger(10);
ai.getAndAdd(2); // 10

ai.get(); // 12

public int addAndGet(int delta): 先计算 val = val + delta,再返回最新值

AtomicInteger ai = new AtomicInteger(10);
ai.addAndGet(2); // 12

ai.get(); // 12

当然,这个方法也支持负数参数,也就意味着可以做减法

AtomicInteger ai = new AtomicInteger(5);

System.out.println(ai.addAndGet(-1)); // 4

6. 硬编码的二元计算逻辑

public int getAndUpdate (IntUnaryOperator opeartion): 使用lambda表达式进行二元运算,获取到的是旧值。

AtomicInteger ai = new AtomicInteger(10);
ai.getAndUpdate(x -> x + 2); // 10, oldVal
ai.get(); // 12

public int updateAndGet (IntUnaryOperator opeartion): 使用lambda表达式进行二元运算,获取到的是新值。

AtomicInteger ai = new AtomicInteger(10);
ai.updateAndGet(x -> x + 2); // 12, newVal
ai.get(); // 12

当然,这里支持减法也同样没问题

AtomicInteger ai = new AtomicInteger(5);
System.out.println(ai.updateAndGet(val -> val - 1)); // 4

7. 非硬编码的二元运算逻辑

public int getAndAccumulate(int factor, IntBinaryOperator operation): 先返回旧值,再进行计算

AtomicInteger ai = new AtomicInteger(10);
int result = ai.getAndAccumulate(5, new IntBinaryOperator() {

    @Override
    public int applyAsInt(int left, int right){
        return left + right;
} }); 

// result = 10, 旧值
ai.get(); // 15新值

public int accumulateAndGet(int factor, IntBinaryOperator operation): 先计算,再返回新值

AtomicInteger ai = new AtomicInteger(10);

int result = ai.accumulateAndGet(5, Integer::sum); // 15
ai.get(); // 15

同样,这个方法的自由度大大提高

int val = -1;



AtomicInteger ai = new AtomicInteger(5);



System.out.println(ai.accumulateAndGet(val, (a, b)-> b-a)); // -6

8. 直接赋值

public void set(int newVal): 直接更新为新值,区别于compareAndSet需要比对旧值。

9. 直接取值

public int get(): 取最新值

附:

底层的CAS是操作系统级别的实现:

public final boolean compareAndSet(int expect, int update) {

​ return unsafe.compareAndSwapInt(this, valueOffset, expect, update);

}

自旋式乐观锁实现数值更新

public final int getAndAddInt(Object object, long valueOffset, int delta) {

    int currentValue;
    do {
        currentValue= this.getIntVolatile(object, valueOffset);
    } while(!this.compareAndSwapInt(object, valueOffset, currentValue,                                     currentValue + delta));
    return currentValue;
}

文章知识点与官方知识档案匹配,可进一步学习相关知识

标签:get,ai,AtomicInteger,int,new,public
From: https://www.cnblogs.com/javaxubo/p/17498542.html

相关文章

  • AtomicInteger
    AtomicInteger是Java中的一个原子类,用于实现对整型变量的原子操作。它提供了一些方法,如get()、set()、getAndSet()、compareAndSet()等,可以实现原子性的读取、设置、获取并设置、比较并设置等操作。以下是一些关于AtomicInteger的链接:Java官方文档:https://docs.oracle.com/java......
  • 为什么AtomicInteger在CAS 在这个过程中不会被其他线程打断
    AtomicInteger中的CAS操作是基于硬件级别的原子操作,因为它是由CPU硬件直接支持的操作。在CAS操作期间,对于同一内存地址的多个线程的访问会被串行化,即同时只有一个线程能够成功执行CAS操作。当一个线程请求执行CAS操作时,如果当前内存地址的值与期望的值相同,那么该线程就成功执行了C......
  • 【Java 并发】【八】【Atomic】【二】AtomicInteger、AtomicBoolean原理
    1 前言这节我们从AtomicInteger这个比较简单的原子类开始,来看看AtomicInteger的底层原理。2  实测样例对比线程安全性在说AtomicInteger的底层原理之前呢,我们先来看个例子感受下原子类:static修饰的共享变量,我们开启两个线程对共享变量进行10000次+1的操作2.1  Integer......
  • CAS 是一种什么样的同步机制?多线程下为什么不使用 int 而使用 AtomicInteger?
    CompareAndSwap,比较交换。可以看到synchronized可以保证代码块原子性,很多时候会引起性能问题,volatile也是个不错的选择,但是volatile不能保证原子性,只能在某些场合下使......
  • AtomicInteger 的使用
    Atomic原子的 Automatic自动的1.synchronized(同步锁):以时间换取安全,效率低下2.ThreadLocal:以空间换取时间,比较消耗资源,安全3.单例模式用双重锁比价好,线程安全且效率......
  • 多线程计数 AtomicInteger
    大家在工作中肯定遇到过计数统计需求,单线程的情况下count直接定义int型就行,可是在多线程并发下会产生多个线程同时count++的情况,那么这种情况就需要用到AtomicInteger来保......
  • redis保存AtomicInteger对象踩坑及解决详解
    这篇文章主要介绍了redis保存AtomicInteger对象踩坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教redis保存AtomicInteger对象踩......
  • 原子操作类AtomicInteger详解
    为什么需要AtomicInteger原子操作类?对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的。num++解析为num=num+1,明显,这个操作不......
  • JAVA原子类 AtomicInteger
    JAVA原子类java原子类位于:JUC包(java.util.concurrent.atomic.Atomic*)中举例:classAtomicIntegerextendsNumberimplementsjava.io.Serializableimportjava.util.co......
  • java中乐观锁CAS的实现探究——AtomicInteger
    CASCAS——compareandswap,比较并交换。是一种乐观锁的实现方式。更新操作时,在每次更新之前,都先比较一下被更新的目标T,值是不是等于读取到的旧值O,如果相等,则认为在读取......