synchronized实现原理

synchronized 代码块实现原理
java 字节码中,用来实现同步代码块的是 monitorenter 和 monitorexit 指令。
monitorenter 指令执行时,当前线程试图获取 objectref 所存储的对象锁(ObjectMonitor 对象)
如果取到的 monitor 对象 _count 字段为 0,则将该线程引用存储在 monitor 对象的 _owner 字段中,并且将 _count 字段加1,线程继续执行,直到线程执行 monitorexit 指令。
如果取到的 monitor 对象 _count 字段不为 0,那么首先会判断该线程是否与 monitor 对象的 _owner 字段存储的引用相同,如果相同,_count 值加 1,仍然可以继续运行,这保证了 synchronized 的可重入性,如果不同,则将该线程放入 _WaitSet,线程进入 wait 状态等待唤醒。

synchronized 方法实现原理
与 synchronized 代码块不同,JVM可以从方法常量池中的方法表结构(method_info Structure) 中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法。
当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先持有 monitor 对象,然后再执行方法,最后再方法完成(无论是正常完成还是非正常完成)时释放 monitor。
如果一个同步方法执行期间抛 出了异常,并且在方法内部无法处理此异常,那这个同步方法所持有的monitor将在异常抛到同步方法之外时自动释放。

posted @   辉辉、  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示