原子操作的原理实现

专业术语:

  比较并交换(Compare And Swap): CAS操作需要两个数值,一个旧值(期望值),一个新值,在操作期间,先比较旧值有没有发生变化,如果旧值没有发生变化,则将新值与旧值进行替换

  缓存行(Cache Line):话黁的最小操作单位

  CPU流水线(CPU pipeline):CPU流水线的操作方式就像工业生产上的装配流水线,在CPU中由五到六个不同功能的电路单元组成一条指令处理流水线,然后将一条X86指令分成5~6步再由这些指令单元分别执行,这样就能实现一个CPU时钟周期完成一条指令,因此提高cpu的执行速率

  内存顺序冲突(Memory order violation):内存顺序冲突一般是由假共享引起的,假共享是指多个CPU同时修改同一个缓存行的不同部分而引起其中一个cpu的操作无效,当出现这个内存顺序冲突时,cpu必须清空流水线

总线锁保证原子性

  使用处理器提供的一个LOCK指令信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞,那么该处理器就可以独占共享区

使用缓存锁保证原子性:

  内存区域如果被缓存在处理器的缓存行中,并且在lock操作期间被锁定,那么当他执行锁操作回写到内存时,处理器不在总线上声言lock信号,而是修改内部的内存地址,并允许他的缓存一致性机制来保证操作的原子性,因为缓存一致性机会会阻止同时修改两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行数据时,会使缓存行无效

  有两种情况不会触发缓存锁的:

  1)、操作数不能被缓存在处理器内部或操作数跨多个缓存行,处理器会调用总线锁定

  2)、处理器不支持缓存锁定(intel 486,pentium处理器)

CAS操作的三大问题:

  一、ABA问题

 二、循环时间长,开销大:当CAS长时间不成功时,会给cpu带来非常大的开销,导致cpu使用率飙高,如果jvm支持处理器提供的pause指令,那么执行效率会有一定的提升。pause指令有两个作用,(一)、延迟流水线的执行指令(de-pipeline),使cpu不会消耗太多的执行资源,延迟的时间取决于具体的实现版本,有的版本延迟为0.(二)、可以避免在退出循环的时候因内存顺序冲突而引起的cpu流水线清空,从而提高执行效率。

三、只能保证一个共享变量的原子性:可以把多个变量放在同一个对象里

posted @ 2021-07-13 00:27  七月流星丶  阅读(137)  评论(0编辑  收藏  举报