【java】AtomicInteger

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
* */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值