概述
synchronized作为一把重量级锁,效率是偏低的,因为需要惊动操作系统大佬。底层使用的是CAS技术实现,再到最底层即汇编程序就一个指令实现:lock cmpxchg。
CAS实现原理
CAS全称:compare and exchange。如下图所示,使用while循环读取内存的值E,计算结果值V,比较E和当前新值N是否相等,如何相等,更新内存的值为V,退出。如果不相等,重新读取E值,继续循环。
ABA问题:在线程往内存中返回新值的过程中,有可能另外一个线程把原来的A值改为了B,然后又把B改回了A,另外一个线程并不知道这个值原来被改过,如果另外一个线程知道值被改过它很在乎,那问题就很大了。这个过程就称为大名鼎鼎的ABA问题。如果解决呢,加个版本号,version。
new出一个对象时,JVM的内存布局
分为四个部分:mark word(对象头),class point(类指向),变量,字节数对齐(被8整除不需要补齐)。
mark word主要记录了锁信息。
锁升级过程
下图为所升级的具体过程。偏向锁==》自旋锁==》重量级锁
四种锁:无状态锁,轻量级锁,偏向锁,重量级锁。
什么是偏向锁?
偏向于第一个进来的线程持有该锁。
偏向锁默认在对象new出来6秒后启动,为什么呢?
因为如果明知道会有多个线程争抢这个锁,为什么还要启动偏向锁呢?