转自: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关键字

最新文章

  1. lua 和 c/c++ 交互 (持续更新)
  2. information_schema系列八(事物,锁)
  3. Android -- 编辑框更改样式
  4. 【golang】go语言,进行并发请求的wrap变参封装
  5. 在EntityFramework6中执行SQL语句
  6. [转]SEP 11.x 迁移
  7. springmvc中url-pattern的大坑
  8. 24种设计模式--状态模式【State Pattern】
  9. 基于mongoDB的capped collection的性能优化
  10. OpenSSl编译
  11. Spring再学习
  12. Python内置函数(5)——pow
  13. SSRS报表服务随笔(rdl报表服务)-报表结构与样式
  14. java mvc spring boot
  15. 「2017 山东一轮集训 Day5」字符串 (后缀自动机, 拓扑排序)
  16. Linux系统用户与属组管理(3)
  17. django源码解析之BigIntegerField (一)
  18. Memcached安装与配置
  19. 【ST】【CF855B】 Marvolo Gaunt&#39;s Ring
  20. js 获取select的值 / js动态给select赋值

热门文章

  1. python之闭包+装饰器
  2. 通过Blazor使用C#开发SPA单页面应用程序(3)
  3. Nginx 502 Bad Gateway 错误的解决方法
  4. jsp和servlet开发过程中参数传递乱码问题总结
  5. Python 数据科学-Numpy
  6. Istio 太复杂?KubeSphere基于Ingress-Nginx实现灰度发布
  7. win10下配置chromedrive。
  8. springBoot配置elasticsearch搜索
  9. Spring学习之旅(十四)--缓存
  10. CentOS -- Redis 3.2.12 Standalone Install and Configuration