package Synchronize;
/***
* 在java中i=i++ 不是线程安全的
* 具体执行过程:
* 栈temp=i;
* i++;
* i=temp;
* 由上可以知道不是一个原子操作,线程不安全
*
* 解决方法:
* synchronized关键字
* AtomicInterger是一个提供原子操作的Interger类,它提供了线程安全且高效的原子操作,其底层的原理是利用处理器的CAS操作来检测栈中的值是否被其他线程改变,
* 如果改变,则CAS操作失败。这种实现方法是在CPU指令级别就已经实现了原子操作,因此,效率是比synchronized来实现要高得多
*
* CAS操作过程都包含三个运算符:内存地址V 期望值A 和新值B 当操作的时候,如果地址V上面存放的值等于期望值A,则将地址V上的赋值为新值B,否则 不做任何操作
* 但是需要返回原值是多少 这就要求保证比较和设值这两个动作都是原子性操作
* 系统主要利用了JNI(java native interface)来保证这个原子操作 它利用CPU硬件支持来完成的,使用硬件提供的swap和test_and_set指令,单cpu下同一指令的多个指令周期不可中断
* SMP中通过锁总线支持这两个指令的原子性
*/
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< 100000000;i++){
test.increase();
}
long end = System.currentTimeMillis();
System.out.println("synchronizedtime:"+(end -start));
long start1 = System.currentTimeMillis();
AtomicInteger atomic = new AtomicInteger(0);
for( int i=0;i< 100000000;i++){
atomic.incrementAndGet();
}
long end1 = System.currentTimeMillis();
System.out.println("AtomicIntegerCompareTime:"+(end1 -start1) );
}
}
/*
synchronizedtime:2532
AtomicIntegerCompareTime:626
* */
【java】AtomicInteger
最新推荐文章于 2024-05-15 16:15:50 发布