AtomicInteger 一个提供原子操作的Integer类
转自:http://www.blogjava.net/freeman1984/archive/2011/10/17/361402.html
AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。
来看AtomicInteger提供的接口。
//获取当前的值
public final int get()
//取当前的值,并设置新的值
public final int getAndSet(int newValue)
//获取当前的值,并自增
public final int getAndIncrement()
//获取当前的值,并自减
public final int getAndDecrement()
//获取当前的值,并加上预期的值
public final int getAndAdd(int delta)
... ...
我们在上一节提到的CAS主要是这两个方法
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
public final boolean weakCompareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
这两个方法是名称不同,但是做的事是一样的,可能在后续的java版本里面会显示出区别来。
详细查看会发现,这两个接口都是调用一个unsafe的类来操作,这个是通过JNI实现的本地方法,细节就不考虑了。
下面是一个对比测试,我们写一个synchronized的方法和一个AtomicInteger的方法来进行测试,直观的感受下性能上的差异
package zl.study.concurrency;
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicIntegerCompareTest {
private int value;
public AtomicIntegerCompareTest(int value){
this.value = value;
}
public synchronized int increase(){
return value++;
}
public static void main(String args[]){
long start = System.currentTimeMillis();
AtomicIntegerCompareTest test = new AtomicIntegerCompareTest(0);
for( int i=0;i< 1000000;i++){
test.increase();
}
long end = System.currentTimeMillis();
System.out.println("time elapse:"+(end -start));
long start1 = System.currentTimeMillis();
AtomicInteger atomic = new AtomicInteger(0);
for( int i=0;i< 1000000;i++){
atomic.incrementAndGet();
}
long end1 = System.currentTimeMillis();
System.out.println("time elapse:"+(end1 -start1) );
}
}
结果
time elapse:31
time elapse:16
由此不难看出,通过JNI本地的CAS性能远超synchronized关键字
最新文章
- lua 和 c/c++ 交互 (持续更新)
- information_schema系列八(事物,锁)
- Android -- 编辑框更改样式
- 【golang】go语言,进行并发请求的wrap变参封装
- 在EntityFramework6中执行SQL语句
- [转]SEP 11.x 迁移
- springmvc中url-pattern的大坑
- 24种设计模式--状态模式【State Pattern】
- 基于mongoDB的capped collection的性能优化
- OpenSSl编译
- Spring再学习
- Python内置函数(5)——pow
- SSRS报表服务随笔(rdl报表服务)-报表结构与样式
- java mvc spring boot
- 「2017 山东一轮集训 Day5」字符串 (后缀自动机, 拓扑排序)
- Linux系统用户与属组管理(3)
- django源码解析之BigIntegerField (一)
- Memcached安装与配置
- 【ST】【CF855B】 Marvolo Gaunt&#39;s Ring
- js 获取select的值 / js动态给select赋值
热门文章
- python之闭包+装饰器
- 通过Blazor使用C#开发SPA单页面应用程序(3)
- Nginx 502 Bad Gateway 错误的解决方法
- jsp和servlet开发过程中参数传递乱码问题总结
- Python 数据科学-Numpy
- Istio 太复杂?KubeSphere基于Ingress-Nginx实现灰度发布
- win10下配置chromedrive。
- springBoot配置elasticsearch搜索
- Spring学习之旅(十四)--缓存
- CentOS -- Redis 3.2.12 Standalone Install and Configuration