实现方式:基于缓存加锁和总线加锁。
?通过总线加锁
(1)所谓总线锁就是使用处理器提供的一个lock#信号,当一个处理器在总线上输出此信号时,其他处理器的请求会被阻塞住,那么该处理器可以独占共享内存。
(2)但总线锁定把cpu和内存之间的通信锁住了,这使得锁定期间,其他处理器不能操作其他内存地址的数据,所以开销比较大。
?使用缓存加锁
所谓“缓存锁定”是指内存区域如果被换存在处理器的缓存行中,并且在lock操作期间被锁定,那么当它执行锁操作回写到内存时,处理器不在总线声言lock#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性➡️➡️因为缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存,当其他处理器回写已被锁定的缓存行的数据时,会使缓存行无效。
?CAS实现原子操作的三大问题
1)ABA问题。描述:原来A 变为B 再变为A,使用cas检查时会发现值没变。 解决方法:在变量面前追加版本号。
2)循环时间长。 解决方法:使用jvm提供的pause指令。 作用1️⃣延迟流水线执行指令,使cpu不会消耗过多的执行资源。2️⃣避免在退出循环的时候因内存顺序冲突而引起cpu流水线被清空。
3)只能保证一个共享变量的原子操作。 解决方法:把多个共享变量合并成一个。