不算那么深入的理解synchronized

本文参考哔哩哔哩马士兵老师课程以及网络资源所学,仅供学习使用,如若侵权,请联系

了解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指令

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页