首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Java字节码角度分析:Synchronized ——提升硬实力11

  • 25-03-07 20:01
  • 4730
  • 7180
blog.csdn.net

在前面的文章中,有详细地介绍java字节码相关的知识,有兴趣的可以提前了解一下。

1.Java字节码的一段旅行经历——提升硬实力1

2.Java字节码角度分析a++ ——提升硬实力2

3.Java字节码角度分析条件判断指令 ——提升硬实力3

4.Java字节码角度分析循环控制 ——提升硬实力4

5.Java字节码角度分析判断结果 ——提升硬实力5

6.Java字节码角度分析构造方法 ——提升硬实力6

7.Java字节码角度分析方法调用 ——提升硬实力7

8.Java字节码角度分析多态原理 ——提升硬实力8

9.Java字节码角度分析异常处理——提升硬实力9

10.Java字节码角度分析:异常_finally——提升硬实力10


从字节码角度分析:Synchronized

我们知道 synchronized 是同步代码块、方法,即通过加锁、解锁来实现的,但我们会显示地加锁,并没有显示地解锁,jvm是如何保证 synchronized 锁能在任何情况下得到正确地释放呢?或者说成对出现呢?带着问题,通过示例代码及对应的字节码一控究竟。

  1. // 从字节码角度分析:synchronized
  2. public class T20_ByteAnalyseSynchronized {
  3. public static void main(String[] args) {
  4. Object lock = new Object();
  5. synchronized (lock) {
  6. System.out.println("ok");
  7. }
  8. }
  9. }

上述代码通过:javap -v T20_ByteAnalyseSynchronized.class进行反编译,得到如下字节码。

  1. public static void main(java.lang.String[]);
  2. descriptor: ([Ljava/lang/String;)V
  3. flags: ACC_PUBLIC, ACC_STATIC
  4. Code:
  5. stack=2, locals=4, args_size=1
  6. 0: new #2 // new Object
  7. 3: dup
  8. 4: invokespecial #1 // invokespecial :()V
  9. 7: astore_1 // lock引用 -> lock
  10. 8: aload_1 // <- lock (synchronized 开始)
  11. 9: dup
  12. 10: astore_2 // lock引用 -> slot 2
  13. 11: monitorenter // monitorenter (lock引用)
  14. 12: getstatic #3 // <- System.out
  15. 15: ldc #4 // <- "ok"
  16. 17: invokevirtual #5 // invokevirtual println:(Ljava/lang/String;)V
  17. 20: aload_2 // <- slot 2 (lock引用)
  18. 21: monitorexit // monitorexit (lock引用)
  19. 22: goto 30
  20. 25: astore_3 // any -> slot 3
  21. 26: aload_2 // <- slot 2 (lock引用)
  22. 27: monitorexit // monitorexit (lock引用)
  23. 28: aload_3
  24. 29: athrow
  25. 30: return
  26. Exception table:
  27. from to target type
  28. 12 22 25 any
  29. 25 28 25 any
  30. LineNumberTable: ...
  31. LocalVariableTable:
  32. Start Length Slot Name Signature
  33. 0 31 0 args [Ljava/lang/String;
  34. 8 23 1 lock Ljava/lang/Object;
  35. StackMapTable: ...

为了更好地理解 synchronized 加锁和释放锁的整个流程,需要将正常流程和异常流程进行确认。 

注意:

  1. 方法级别的 synchronized 不会在字节码指令中有所体现

 

总结:

  1. synchronized 是通过 monitorenter和 monitorexit 实现锁的获取和释放,并且他俩是成对出现。 monitorenter 入口只有一个,但是 monitorexit 的出口有多个,因为程序异常也需要将锁释放
  2. 当代码段执行结束或出现异常后会自动释放对监视器的锁定。

 


文章最后,给大家推荐一些受欢迎的技术博客链接:

  1. Hadoop相关技术博客链接
  2. Spark 核心技术链接
  3. JAVA相关的深度技术博客链接
  4. 超全干货--Flink思维导图,花了3周左右编写、校对
  5. 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
  6. 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
  7. 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂

 


欢迎扫描下方的二维码或 搜索 公众号“10点进修”,我们会有更多、且及时的资料推送给您,欢迎多多交流!

                                           

       

注:本文转载自blog.csdn.net的不埋雷的探长的文章"https://blog.csdn.net/weixin_32265569/article/details/108029583"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top