本文参考哔哩哔哩马士兵老师课程以及网络资源所学,仅供学习使用,如若侵权,请联系
了解synchronized底层,需要了解以下基础知识
(1)CAS
CAS就是compareAndSwap,比较替换,它一版有四个参数,compareAndSwap(Object var1, long var2, int var4, int var5),
简单理解就是比对var4是否等于var2,如果等于,将内存中的var2修改为var5
(2)CAS底层实现
底层是c++语言,不太懂,只知道是通过 lock cmpxchg 指令进行修改的,cmpxchg 指令也非原子操作{也就是当是多核CPU时,该指令非安全,所以加了lock指令}
(3)普通对象的内存布局Jave Object Layout【一个Object o = new Object()对象所占字节是16个字节】
(4)markword的细节
markword中包含了锁信息,而锁大概又分为以下几种
、
而每种锁在markword中的标记大致如下:
(5)偏向锁【-xx:BiasedLockingStartupDelay=0 这个参数设置对象偏向锁的启动延迟时间,也就是决定当对象新建后,多长时间后启动偏向锁,对应上述在markword中的标记位内容】
偏向锁有延迟,也就是JVM启动后,四秒钟后偏向锁才会开启【因为JVM启动过程中肯定会有多个线程去操作内存、去竞争资源,开启偏向锁没意义,会涉及锁撤销,所以会延迟偏向锁的开启,不然即使开了偏向锁也会转为轻量级或者重量级,还不如不开。】===可能对应面试题:偏向锁一定比自旋锁效率高吗?为什么?
(6).class文件形成的指令,通过 monitorenter、monitorexit指令来获取锁和释放锁【为什么两个monitorexit,因为还有异常情况,也自动释放】
(7)synchronized汇编语言的底层也是lock cmpxchg指令