如果你曾经接触过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一些知识问答,记得继续关注本站消息。