AtomicInteger 类提供了int类型的变量 , 变量可以原子写和读 , 同时还包括先进的原子操作例如 compareAndSet() 。AtomicInteger 类位于JAVA.util.concurrent.atomic 包中 , 全名java.util.concurrent.atomic. AtomicInteger。本文讲述JAVA8中的AtomicBoolean , 但是第一个版本是在Java 5中 。
关于AtomicInteger 设计原理可以参考 Compare and Swap 。
创建AtomicInteger如下代码创建AtomicInteger:
AtomicInteger atomicInteger = new AtomicInteger();
上述例子创建了初始值为0的AtomicInteger , 如果需要创建指定值的AtomicInteger , 则代码如下:
【JAVA并发-AtomicInteger】AtomicInteger atomicInteger = new AtomicInteger(123);
例子中用123作为AtomicInteger 构造函数的参数 , 意思就是AtomicInteger 实例的初始值为123 。
获取AtomicInteger 的值可以通过 AtomicInteger的 get() 方法获取值 , 下面是代码 AtomicInteger.get():
AtomicInteger atomicInteger = new AtomicInteger(123); int theValue = https://www.isolves.com/it/cxkf/yy/JAVA/2020-08-12/atomicInteger.get();
设置AtomicInteger的值可以通过 AtomicInteger 的set()方法设置值 , 下面是 AtomicInteger.set()的例子
AtomicInteger atomicInteger = new AtomicInteger(123); atomicInteger.set(234);
例子中创建了一个初始值为123的 AtomicInteger , 然后设置为234.
比较设置(CAS)的AtomicInteger值AtomicInteger类同样有原子的compareAndSet()方法 , 首先与AtomicInteger 实例值得当前比较 , 如果相对这设置AtomicInteger 的新值 , 下面AtomicInteger.compareAndSet()代码:
AtomicInteger atomicInteger = new AtomicInteger(123); int expectedValue = https://www.isolves.com/it/cxkf/yy/JAVA/2020-08-12/123;int newValue = 234;atomicInteger.compareAndSet(expectedValue, newValue);
首先创建初始值为123的 AtomicInteger实例 , 然后当前值与期望值123比较 , 如果相对则设置值为234.
增加AtomicInteger的值AtomicInteger类包含了一些增加和获取返回值的方法:
- addAndGet()
- getAndAdd()
- getAndIncrement()
- incrementAndGet()
AtomicInteger atomicInteger = new AtomicInteger(); System.out.println(atomicInteger.getAndAdd(10));System.out.println(atomicInteger.addAndGet(10));
代码例子将大于0和20 , 首先获取AtomicInteger 增加10之前的值是0 , 然后再增加值并获取当前值是 20.同样可以通过两个方法增加负值 , 相当于做减法 , getAndIncrement()和 incrementAndGet() 与 getAndAdd()和 addAndGet()的工作原理相似 , 只不是加1.AtomicInteger 减法AtomicInteger类同样可以原子性的做减法 , 面是方法:
- decrementAndGet()
- getAndDecrement()
参考:http://tutorials.jenkov.com/java-util-concurrent/atomicinteger.html
http://tutorials.jenkov.com/java-concurrency/compare-and-swap.html
推荐阅读
- Java正则表达式详解
- 美团对 Java 新一代垃圾回收器 ZGC 的探索与实践
- java中的装箱和拆箱
- 2019年的6个JavaScript用户认证库
- 又一个小而美的Java Web框架:Solon
- 如何进行Jmeter多接口指定TPS同时并发?
- 万字详文:Java内存泄漏、性能优化、宕机死锁的N种姿势
- javascript 知识普及之 FormData
- 技术转载 || 使用java API进行zip递归压缩文件夹以及解压
- 两万字长文读懂 Java 集合