您的位置:首页 > 编程语言 > Java开发

java AtomicInteger 类学习

2013-04-27 14:13 495 查看
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)

... ...

首先说一下volatile:

Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存重新读取该成员的值,而且,当成员变量值发生变化时,强迫将变化的值重新写入共享内存,这样两个不同的线程在访问同一个共享变量的值时,始终看到的是同一个值。

而AtomicInteger也是定义的volatile类型:

    private volatile int value;

下面是一个对比测试,我们写一个synchronized的方法和一个AtomicInteger的方法来进行测试,直观的感受下性能上的差异

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 start1 = System.currentTimeMillis();  

        

        AtomicInteger atomic = new AtomicInteger(0);  

          

        for( int i=0;i< 1000000;i++){  

            atomic.incrementAndGet();  

        }  

        long end1 = System.currentTimeMillis();  

        System.out.println("atomicInteger time elapse:"+(end1 -start1) );

        

        

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

    }  

Reference
http://stackoverflow.com/questions/2443239/java-atomicinteger-what-are-the-differences-between-compareandset-and-weakcompar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息