从字节码角度理解 synchronized原理

synchronized原理

代码案例

package cn.knightzz.test;

/**
 * @author 王天赐
 * @title: TestSynchronizedSource
 * @projectName hm-juc-codes
 * @description: 测试Synchronized原理
 * @website <a href="http://knightzz.cn/">http://knightzz.cn/</a>
 * @github <a href="https://github.com/knightzz1998">https://github.com/knightzz1998</a>
 * @create: 2022-07-08 21:11
 */
public class TestSynchronizedSource {

    static final Object lock = new Object();
    static int count = 0;


    public static void main(String[] args) {

        synchronized (lock) {
            count++;
        }

    }
}

可以使用 jclasslib 插件查看字节码

image-20220708212019978

可可以使用

image-20220708212621033

  • getstatic #2 <cn/knightzz/test/TestSynchronizedSource.lock : Ljava/lang/Object;>
  • dup 复制
  • astore_1
    • 拿到锁的对象 lock 的引用地址, 并复制一份, 然后存储到临时变量 slot1
  • monitorenter
    • 将 lock对象的markword 置为monitor指针
  • getstatic #3 <cn/knightzz/test/TestSynchronizedSource.count : I>
  • iconst_1
  • iadd
    • count++ 操作
  • putstatic #3 <cn/knightzz/test/TestSynchronizedSource.count : I>
  • aload_1
    • 拿到 slot1 中临时的 lock 引用地址
  • monitorexit
    • 将 lock对象monitor锁重置, 唤醒 EntryList
  • goto 24 (+8)
    • 跳转到 24行 处理异常情况
  • astore_2
    • 将异常对象存储到临时变量 2
  • aload_1
    • 加载 lock 引用地址
  • monitorexit
    • 将 lock对象monitor锁重置, 唤醒 EntryList
  • aload_2
  • athrow
    • 抛出异常
  • return

流程图解

image-20220708221535091

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兀坐晴窗独饮茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值