原创

synchronized分析

温馨提示:
本文最后更新于 2025年07月19日,已超过 329 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

3种加锁方式

作用位置
作用于实例方法当前实例加锁,进入同步代码块前要获得当前实例的锁
作用于代码块对括号里配置的对象加锁
作用于静态方法当前类加锁,进去同步代码块前要获得当前对象的锁

字节码角度 

javap -c **.class 对代码进行 反汇编

javap -v verbose  输出附加信息(包括行号、本地变量表、反汇编等详细信息)

同步代码块

底层是monitorenter 和 moniterexit 来保证锁的获取和释放。 

moniterenter个数moniterexit  个数原因
代码顺利执行12第1个moniterexit   是代码顺利执行进行锁释放。第二个  是 当代码执行出现异常时,抛出异常,并保证释放锁
代码出现异常11

普通同步方法

调用指令将会检查方法的ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程会将先持有monitor锁,然后再执行方法。最后在方法完成(无论是正常完成还是非正常完成)时释放monitor

底层 flags:会有 ACC_SYNCHRONIZED 标识

静态同步方法

底层 flags:会有 ACC_SYNCHRONIZED 和 ACC_STATIC    2个标识


正文到此结束