java中线程安全的计数/运算_AtomicInteger原子操作类
在实际业务中进行部分功能的开发时,不可避免的会遇上算数运算、计数等操作。
最典型的表现就是代码中一个又一个的 i++ (或者 num++ 之类的) 、i – – 等自增自减运算。
在普通的应用中当然可以这样。但是如果是一个上线的业务,一定会遇到并发访问的情况。
或许是多个线程(比如web请求)对某一方法中的公有变量进行增减。
也或者是实现功能的线程需要对某个值进行动态更改并且获取。
如果只是使用普通的加减运算,数量较少还好。但是如果进行的计算比较多、线程也比较多的话,那么普通的加减运算则不能做到足够精准。
java 便在 java.util.concurrent.atomic 包下提供了几个原子操作类比如 AtomicBoolean、AtomicLong、AtomicInteger。
这里主要说 AtomicInteger,其他的也差不了多少,去翻一翻 API 就好啦
JDK1.6 的 API 对该类的描述(最新的汉化版就是 1.6的 啦) 可以看一下:
可以用原子方式更新的 int
值。有关原子变量属性的描述,请参阅 java.util.concurrent.atomic
包规范。AtomicInteger
可用在应用程序中(如以原子方式增加的计数器),并且不能用于替换 Integer
。但是,此类确实扩展了 Number
,允许那些处理基于数字类的工具和实用工具进行统一访问。
AtomicInteger类主要方法:
public final int getAndSet(int newValue) //给AtomicInteger设置newValue并返回加oldValue public final boolean compareAndSet(int expect, int update) //如果输入的值和期望值相等就set并返回true/false public final int getAndIncrement() //对AtomicInteger原子的加1并返回当前自增前的value public final int getAndDecrement() //对AtomicInteger原子的减1并返回自减之前的的value public final int getAndAdd(int delta) //对AtomicInteger原子的加上delta值并返加之前的value public final int incrementAndGet() //对AtomicInteger原子的加1并返回加1后的值 public final int decrementAndGet() //对AtomicInteger原子的减1并返回减1后的值 public final int addAndGet(int delta) //给AtomicInteger原子的加上指定的delta值并返回加后的值
建议在多线程环境下将
int i = 1;
i++;
替换为
AtomicInteger atomicInteger = new AtomicInteger(1);
atomicInteger.getAndIncrement();