首页 > 经验记录 > java中线程安全的计数/运算_AtomicInteger原子操作类

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();
 

           


EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00