小小Javaer没用过AtomicInteger?
我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情
Class
java.lang.Object
java.lang.Number
java.util.concurrent.atomic.AtomicInteger
实现的接口:Serializable
注意(官方翻译):
AtomicInteger 在Java 1.5就已经存在了,该类不是 java.lang.Integer 的替代品!该类中并没有自定义equals
、hashCode
和compareTo
等方法。 因为原子变量预计会发生变异,所以它们是哈希表键的糟糕选择。
使用场景介绍:
- 多线程情况下我们对int值执行原子操作(即用作
原子计数器
),而无需使用Synchronized
关键字。 - 多线程情况下对int值的赋值操作 :compareAndSet
构造函数
构造函数 | 描述 |
---|---|
AtomicInteger() | 创建一个具有初始值为0的 AtomicInteger |
AtomicInteger(int initialValue) | 使用给定的初始值创建一个新的 AtomicInteger |
原子计数
方法介绍:
方法修饰符、返回类型 | 方法名 | 描述 |
---|---|---|
final int | get() | 返回当前值 |
int | intValue() | 以int形式返回当前值,底层就是调用的get() |
final int | addAndGet() | 以原子方式将给定值添加到当前值,并在添加后返回新值 |
final int | getAndAdd | 以原子方式将给定值添加到当前值并返回旧值 |
final int | crementAndGet | 以原子方式将当前值增加1,并在增加之后返回新值。 它等效于++i 操作 |
final int | getAndIncrement | 以原子方式递增当前值并返回旧值。 它等效于i ++ 操作 |
final int | decrementAndGet | 以原子方式将当前值减1,并在减后返回新值。 它等效于 i-- 操作 |
final int | getAndDecrement | 以原子方式减少当前值并返回旧值。 它等效于 --i 操作 |
demo:
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(10);
System.out.println(atomicInteger.get()); //10
System.out.println(atomicInteger.intValue()); //10
System.out.println(atomicInteger.addAndGet(1)); //11
System.out.println(atomicInteger); //11
System.out.println(atomicInteger.getAndAdd(1)); //11
System.out.println(atomicInteger); //12
System.out.println(atomicInteger.incrementAndGet()); //13
System.out.println(atomicInteger); //13
System.out.println(atomicInteger.getAndIncrement()); //13
System.out.println(atomicInteger); //14
System.out.println(atomicInteger.decrementAndGet()); //13
System.out.println(atomicInteger); //13
System.out.println(atomicInteger.getAndDecrement()); //13
System.out.println(atomicInteger); //12
}
compareAndSet
方法介绍:
方法修饰符、返回类型 | 方法名 | 描述 |
---|---|---|
final boolean | compareAndSet(int expectedValue, int newValue) | 如果当前值等于预期值,以原子方式将值设置为newValue,修改成功返回true,否则false |
compareAndSet方法实际上是做了两步操作:
- 第一步是比较当前value值是否为预期值(expectedValue)
- 第二步是把当前value值更新为newValue,这两步是原子操作,在没有多线程锁的情况下,借助cpu锁保证数据安全。
demo:
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(10);
System.out.println(atomicInteger.compareAndSet(10,20)); //true
System.out.println(atomicInteger.compareAndSet(10,20)); //false
}
转载自:https://juejin.cn/post/7140438840094752781