synchronize字节码解析

爱被打了一巴掌 2021-12-24 11:25 377阅读 0赞

源java文件:

  1. public class TestSynchronize {
  2. static volatile int b;
  3. public static void main(String[] args) {
  4. String s = new String("xxx");
  5. int a = 10;
  6. synchronized(s){
  7. a++;
  8. }
  9. b = 10;
  10. }
  11. }

字节码文件:

  1. public class com.learn.test.code.bytecode.TestSynchronize {
  2. static volatile int b;
  3. public com.learn.test.code.bytecode.TestSynchronize();
  4. Code:
  5. 0: aload_0
  6. 1: invokespecial #1 // Method java/lang/Object."<init>":()V
  7. 4: return
  8. public static void main(java.lang.String[]);
  9. Code:
  10. 0: new #2 // class java/lang/String
  11. 3: dup
  12. 4: ldc #3 // String xxx
  13. 6: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V
  14. 9: astore_1
  15. 10: bipush 10
  16. 12: istore_2
  17. 13: aload_1
  18. 14: dup
  19. 15: astore_3
  20. 16: monitorenter
  21. 17: iinc 2, 1
  22. 20: aload_3
  23. 21: monitorexit
  24. 22: goto 32
  25. 25: astore 4
  26. 27: aload_3
  27. 28: monitorexit
  28. 29: aload 4
  29. 31: athrow
  30. 32: bipush 10
  31. 34: putstatic #5 // Field b:I
  32. 37: return
  33. Exception table:
  34. from to target type
  35. 17 22 25 any
  36. 25 29 25 any
  37. }

i++对应的字节码如下:

  1. 17: iinc 2, 1
  2. 20: aload_3

他们被moniterenter和moniterexit如下包围起来:

  1. 16: monitorenter
  2. 17: iinc 2, 1
  3. 20: aload_3
  4. 21: monitorexit

发表评论

表情:
评论列表 (有 0 条评论,377人围观)

还没有评论,来说两句吧...

相关阅读