一. 处理器实现原子操作
- 通过总线锁保证原子性:某个处理器在总线上输出LOCK #信号,其他处理器的请求将被阻塞,该处理器独占共享内存。
- 通过缓存锁保证原子性:即不锁总线了,而是把该内存地址对应的缓存行锁住。例如:多个CPU都有某个内存地址的缓存行,如果某个CPU要对这个缓存行进行写回操作时,那么内存地址对应的所有缓存行都被锁住。
参考:
https://yemablog.com/posts/cache-locking-2
https://www.jianshu.com/p/2c212631c7ca
https://mp.weixin.qq.com/s/PDUqwAIaUxNkbjvRfovaCg
二. Java实现原子操作
-
循环CAS实现原子操作
(1)基本概念
CAS比较并交换,即使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值。
(2)原理
CAS操作利用处理器提供的CMPXCHG指令实现,保证该操作的原子性
(3)不足
1)ABA问题,解决办法:加个版本号。AtomicStampedReference
2)自旋CAS如果长时间不成功,会给CPU带来很大开销。
3)只保证一个共享变量的原子操作,但对多个共享变量操作时无法保证。 -
使用锁机制保证原子操作
只有获得锁的线程才能操作锁定的内存区域,这些锁机制即为偏向锁、轻量级锁、互斥锁。但轻量级锁、互斥锁也依赖循环|CAS。