一些术语
名称 | 解释 |
---|---|
内存顺序冲突 | 内存顺序冲突一般是由于假共享引起的,假共享是指多个cpu同时修改同一个缓存行的不同部分而引起 其中一个cpu的操作无效,当这个内存顺序冲突时,cpu必须清空流水线 |
处理器如何实现院子操作
使用总线锁保证原子性
所谓总线锁就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号是,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存.
使用缓存锁保证原子性
同一时刻,我们只需要保证对某个内存地址的操作时原子性即可,但总线锁定吧CPU和内存之间的通信锁住了.,锁定期间,其他处理器不能操作其他内存地址的数据.总线锁定开销太大
所谓缓存锁定,是指在内存区域如果被缓存在处理器的缓存行中,并在LOCK操作期间被锁定, 那么当他执行所操作回写到内存时,处理器不在总线上声言LOCK#信号,而是修改内部的内存地址,并允许他的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行数据时,会使缓存行无效
两种情况不会使用缓存锁定
- L当操作数据不能被缓存在处理器内部,或操作的数据跨多个缓存行时,会调用总线锁定
- 有些处理器不支持缓存锁定
CAS
CAS正是利用了处理器提供的CMPXCHG执行来实现的
cas实现原子操作的三大问题
使用锁机制实现院子操作
JVM内部提供了很多种锁机制,有偏向锁,轻量级锁和互斥锁.
除了偏向锁,JVM实现锁的方式都使用了循环CAS