CAS机制学习

/**
 * 无锁优化  自旋
 * CAS是CPU的原语支持。。。
 * 无锁优化就是没有加锁 通过值的比较实现线程安全。
 * cas(V, ExceptValue, NewValue)
 * 首先有一个内存空间这个内存空间用来存放实际的值。
 * 整体流程就是相当于有一个篮子,篮子就相当于一块内存空间 然后篮子里面有一定数量的苹果
 * 我去往里面放苹果,我期望篮子里面有多少个苹果 放的时候比较以及篮子里面实际的苹果数量是不是我期望的
 * 如果是 则将我的数量给他 否则不更新数据 重新拿到一个新的期望值再比较一番。。
 *
 * ABA问题: 因为这里有个比较的过程,拿自己的期望值去比较,在我比较的过程中有一个线程去改了数据,同时又有另外一个线程将数据改了回来。
 * 1->2->1 需要加上一个版本号就可以解决了,比较值的时候同时比较版本,如果是基础类型无所谓
 *
 * 之前保证线程安全都是使用加锁, 现在不需要加锁,底层还是使用了unsafe这个类
 * 这个类可以直接操作jvm中的内存。。 jdk1.8到jdk11 中的方法有些改动。。
    LongAdder 底层采用分段锁的方式。。
 */
public class AutomicTest {

    private AtomicInteger atomicInteger = new AtomicInteger(0);

    void m() {
        for (int i = 0; i < 1000; i++) {
            atomicInteger.incrementAndGet();
        }
    }

    public static void main(String[] args) {
        AutomicTest automicTest = new AutomicTest();

        List<Thread> threads = new ArrayList<>(100);
        for (int i = 0; i < 100; i++) {
            threads.add(new Thread(automicTest::m, "t"+i));
        }

        threads.forEach(a-> a.start());
        threads.forEach(a-> {
            try {
                a.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println(automicTest.atomicInteger.get());
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值