CAS
Compare And Swap
借助了cpu的指令,compxchg,具体实现原理
V是读取内存的值,A是寄存器里面的值,value是要更新的值,JDK会通过compxchg指令,判断寄存器里面A的值是否和V相等,如果相等,直接更新A的值为value,如果不相等,就将内存的值V更新到寄存器的A,再重试
具体代码如下:
CAS存在三个问题
-
ABA问题
可以通过增加版本号,来解决ABA问题,如1A,2B,3A
JDK 1.5版本提供了AtomicStampedReference 来解决这个问题,原理是compareAndSet首先检查 当前引用和当前标志与预期引用和预期标志是否都相等,如果相等,则更新 -
自旋重试消耗CPU CAS如果竞争很激烈,会一直重试
-
只能保证一个变量的原子操作
寄存器的结构
计算机由CPU(运算器和控制器),IO(输入输出),存储器(磁盘和主存)
CPU (Central Processing Unit)
内存即RAM,随机存取存储器(Random Access Memory)
硬盘即HDD(Hard Disk Drive)
运算器:主要由算术逻辑单元(ALU)、累加寄存器(ACC)、乘商寄存器(MQ)状态存储器、通用存储器等组成。
控制器:主要由控制单元(CU)、指令寄存器(IR)、程序计数器(PC)组成。CU主要执行指令的作用,IR一般存放当前欲执行指令、PC存放下一条指令的地址。
存储器:主要由存储体 M,地址寄存器(MAR)、数据寄存器组成(MDR)。MAR一般反映的是存储单元的个数,而MDR反映的是存储的字长。
CPU三级缓存
https://blog.youkuaiyun.com/qq_38877888/article/details/103118068