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
当然要求数据量大的时候才能发现其中的性能的差距。
来看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
当然要求数据量大的时候才能发现其中的性能的差距。
相关文章推荐
- synchronized和AtomicInteger解决并发问题的性能比较
- 对于Synchronized、ReentrantLock、Atomic、CAS在并发下面的性能比较测试
- LongAdder与AtomicInteger并发性能的简单比较测试
- 各种同步方法性能比较(synchronized,ReentrantLock,Atomic)
- 一次比较麻烦的性能问题诊断及解决
- 改进的单例模式,解决并发生成多实例问题,并且提高调用时的性能
- 高并发热点/单点数据_性能问题解决方案
- 各种同步方法性能比较(synchronized,ReentrantLock,Atomic)
- Python:通过执行100万次打印来比较C和python的性能,以及用C和python结合来解决性能问题的方法
- 各种同步方法性能比较(synchronized,ReentrantLock,Atomic)
- Python:通过执行100万次打印来比较C和python的性能,以及用C和python结合来解决性能问题的方法 .
- 各种同步方法性能比较(synchronized,ReentrantLock,Atomic)
- 聊聊高并发(十二)分析java.util.concurrent.atomic.AtomicStampedReference源码来看如何解决CAS的ABA问题
- 解决Scrapy性能问题——案例五(Item并发太多导致溢出)
- AtomicInteger解决线程同步的问题
- 当web应用中面临大数据量同时并发量比较大的情况下性能是一个尤为重要的问题,面对性能优化我们应从何做起,在哪些方面做优化呢?
- 如何解决网站大规模并发访问带来的性能下降问题
- 单例模式之懒汉的并发问题,只需要添加一个 synchronized 就可以解决了
- JAVA的synchronized关键字与concurrent并发包的性能比较。