您的位置:首页 > 其它

synchronized和AtomicInteger解决并发问题的性能比较

2017-03-31 14:40 405 查看
AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而volatile修饰的变量作为共享变量。

来看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(
for( int i=
test.increase();

}

long end = System.currentTimeMillis();

System.out.println(+(end -start));

long start1 = System.currentTimeMillis();

AtomicInteger atomic = new AtomicInteger(

for( int i=
atomic.incrementAndGet();

}

long end1 = System.currentTimeMillis();

System.out.println(+(end1 -start1) );

}

}

运行结果如下:

time elapse:31026

time elapse:14101

当然要求数据量大的时候才能发现其中的性能的差距。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐