synchronized分析
温馨提示:
本文最后更新于 2025年07月19日,已超过 329 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
3种加锁方式
| 作用位置 | |
|---|---|
| 作用于实例方法 | 当前实例加锁,进入同步代码块前要获得当前实例的锁 |
| 作用于代码块 | 对括号里配置的对象加锁 |
| 作用于静态方法 | 当前类加锁,进去同步代码块前要获得当前对象的锁 |
字节码角度
javap -c **.class 对代码进行 反汇编
javap -v verbose 输出附加信息(包括行号、本地变量表、反汇编等详细信息)
同步代码块
底层是monitorenter 和 moniterexit 来保证锁的获取和释放。
| moniterenter个数 | moniterexit 个数 | 原因 | |
|---|---|---|---|
| 代码顺利执行 | 1 | 2 | 第1个moniterexit 是代码顺利执行进行锁释放。第二个 是 当代码执行出现异常时,抛出异常,并保证释放锁 |
| 代码出现异常 | 1 | 1 |
普通同步方法
调用指令将会检查方法的ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程会将先持有monitor锁,然后再执行方法。最后在方法完成(无论是正常完成还是非正常完成)时释放monitor
底层 flags:会有 ACC_SYNCHRONIZED 标识
静态同步方法
底层 flags:会有 ACC_SYNCHRONIZED 和 ACC_STATIC 2个标识
正文到此结束
- 本文标签: Java
- 本文链接: http://119.91.109.247:8443//article/120
- 版权声明: 本文由张亚东原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权