synchronized
基于JVM监视器实现,只支持非公平锁,不需要手动释放锁。
ReentrantLock
基于AQS在java应用层实现,可以非公平和公平锁,支持tryLock无阻塞访问锁,需要手动释放锁。
CAS实现原理
cas在底层是调用native方法,该方法由C++实现。
如果是多处理器,则会加上lock前缀。
带有 lock 前缀的指令在执行期间会锁住总线,使得其他处理器暂时无法通过总线访问内存。很显然,这会带来昂贵的开销。
通过这一点就可以实现多处理器同步。
另一种方式是缓存锁定,CPU有多级缓存机制,每一个缓存的最小单元是缓存行,
在L3缓存是cpu共享的,由于CPU从主存加载数据局时,会复制数据到L3,l2,l1中。读取时,会依次从l1,l2,l3读取。
所以缓存锁定在L3中锁定对应的缓存行,那么其他cpu就没有办法对相应的缓存行进行修改。
为了避免缓存锁定的数据在其他cpu不一致的情况,在这里还有MESI一致性协议去确保一致性。
简单来说,假设最开始缓存是独占状态Exclusive,只有一个cpu拥有,在其他cpu获取从主存中加载了该数据,那么缓存变为Shared状态,并且数据一致,假设某个cpu修改了缓存数据,那么缓存行变为Modified状态,只有该cpu的缓存和主存中的数据一致,而其他cpu的缓存行则是invaild状态,此时会去内存中再次加载该数据,通过这样实现了数据的一致性。
- 本文作者: 宏
- 本文链接: http://sasuke.top/2024/08/02/Sync和reentrylock的区别CAS原理/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!