• 多线程基础01:深入理解CAS原理


    多线程改变某变量值时,大多用synchronize加锁,效率较低,在jdk1.5之后加了原子类,例如:AtomicInteger(无锁、自旋锁)

    AtomicInteger i = new AtomicInteger();

    i.incrementAndGet();

    无锁实现多线程自增

    实现原理:CAS技术(compare and swap/compare and exchange)

    无锁状态下保证多个线程对一个值的更新

    多线程状态并在无锁的时候,保证线程一致性去改动某一个值这就是CAS技术。

    ABA问题:在比较当前值后/修改值前,另一线程也同时把当前值取走并修改与当前值相等的情况

    解决ABA问题:对每个当前值加version,任何线程对当前值修改,都要修改版本号,当前线程取走当前值修改时也取走当前版本,在比较值的同时也比较版本号

    如果ABA不产生影响,不用考虑

     API(源码跟踪)

     

    asm(汇编语言):

         cmpxchgl(compare and change):比较并交换,java CAS操作在底层上有对应的汇编指令,硬件级别直接执行

         LOCK_IF_MP(MP:multiProcessors 多个CPU)

    最终执行指令:lock cmpxchg 指令

    如果确保CAS在比较后/写入前时的值不被其他线程修改?

    首先:cmpxchg是不能保证数据的原子性(CAS支持执行cmpxchg比较交换底层指令,但该指令非原子性)

    Lock:当执行后面的指令时,其他CPU不能对后面的值进行操作

  • 相关阅读:
    Ajax跨域解决实例
    关于tween.js测试介绍
    signal() 和 sigaction()
    信号概述
    监控文件事件
    栈和栈帧
    进程结构和内存布局
    关于文件I/o的原子操作
    查询Linux系统中glibc的版本
    IOPS和Throughput
  • 原文地址:https://www.cnblogs.com/chai-blogs/p/13401727.html
Copyright © 2020-2023  润新知