AtomicInteger的实现原理是什么?

2020-04-15 19:04:02 java常见问答 6199

如果你曾经接触过java有关的软件开发问题,那么可能也知道,java的并发原子包里面提供了很多可以进行原子操作的类,今天小编就是想要带感兴趣的朋友一起来看看其中之一,AtomicInteger类,所以AtomicInteger的实现原理究竟是什么呢?

其实在没有AtomicInteger之前呢,一个Integer的线程安全操作,是要使用同步锁去实现的,这当然现在也是通过ReentrantLock来实现的,但是最好最便利的实现方式其实是是采用AtomicInteger。

具体示例如下:

package com.collection.test;
import java.util.concurrent.atomic.AtomicInteger; /** * 原子类的测试 */
public class AtomicTest
{
    private static AtomicInteger atomicInteger = new AtomicInteger(); //获取当前值
    public static void getCurrentValue()
    {
        System.out.println(atomicInteger.get()); //-->0
    }
    //设置value值
    public static void setValue()
    {
        atomicInteger.set(12); //直接用12覆盖旧值
        System.out.println(atomicInteger.get()); //-->12
    }
    //根据方法名称getAndSet就知道先get,则最后返回的就是旧值,如果get在后,就是返回新值
    public static void getAndSet()
    {
        System.out.println(atomicInteger.getAndSet(15)); //-->12
    }
    public static void getAndIncrement()
    {
        System.out.println(atomicInteger.getAndIncrement()); //-->15
    }
    public static void getAndDecrement()
    {
        System.out.println(atomicInteger.getAndDecrement()); //-->16
    }
    public static void getAndAdd()
    {
        System.out.println(atomicInteger.getAndAdd(10)); //-->15
    }
    public static void incrementAndGet()
    {
        System.out.println(atomicInteger.incrementAndGet()); //-->26
    }
    public static void decrementAndGet()
    {
        System.out.println(atomicInteger.decrementAndGet()); //-->25
    }
    public static void addAndGet()
    {
        System.out.println(atomicInteger.addAndGet(20)); //-->45
    }
    public static void main(String[] args)
    {
        AtomicTest test = new AtomicTest();
        test.getCurrentValue();
        test.setValue(); //返回旧值系列
        test.getAndSet();
        test.getAndIncrement();
        test.getAndDecrement();
        test.getAndAdd(); //返回新值系列
        test.incrementAndGet();
        test.decrementAndGet();
        test.addAndGet();
    }
}

还有就是要注意:

单步操作:例如set()方法是直接对value进行操作的,是不需要CAS的,因为单步操作其实就是原子操作。

多步操作:例如getAndSet(int newValue)是两步操作——先获取值,再设置值,这样的话需要原子化,这里是采用CAS的实现。

对于方法是返回旧值还是新值的问题,可以直接看下方法是用get开头,还是get结尾就可以了。

CAS:比较CPU内存上的值是不是当前值current,如果是就换成新值update,如果不是,说明获取值之后到设置值之前,该值已经被别人先一步设置过了,这个时候如果再去设置值的话,需要在别人修改后的值的基础上去操作,不然就会覆盖别人的修改,那么这个时候会可能就直接返回false了,再去进行无限循环,去重新获取当前值,然后再基于CAS进行加减的操作。

那么以上就是关于AtomicInteger实现原理的相关内容了,如果还想继续了解更多java一些知识问答,记得继续关注本站消息。