使用javap分析synchronized关键字

案例代码

代码示例

 public class ThreadExample {
    
    private static Integer  count=25;
    
    public static void main(String[] args) {
        synchronized (ThreadExample.class) {
            count++;
        }
    }
}

使用使用javap查看这段代码的字节码文件

进入class文件所在目录

字节码内容如下

C:\sts_workspace\concurrentInJava\bin\com\thread>javap -v  ThreadExample.class
Classfile /C:/sts_workspace/concurrentInJava/bin/com/thread/ThreadExample.class
  Last modified 2019-1-16; size 760 bytes
  MD5 checksum 4164dbb1f4baa20fe067fd4f68a3221c
  Compiled from "ThreadExample.java"
public class com.thread.ThreadExample
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Class              #2             // com/thread/ThreadExample
   #2 = Utf8               com/thread/ThreadExample
   #3 = Class              #4             // java/lang/Object
   #4 = Utf8               java/lang/Object
   #5 = Utf8               count
   #6 = Utf8               Ljava/lang/Integer;
   #7 = Utf8               <clinit>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Methodref          #11.#13        // java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
  #11 = Class              #12            // java/lang/Integer
  #12 = Utf8               java/lang/Integer
  #13 = NameAndType        #14:#15        // valueOf:(I)Ljava/lang/Integer;
  #14 = Utf8               valueOf
  #15 = Utf8               (I)Ljava/lang/Integer;
  #16 = Fieldref           #1.#17         // com/thread/ThreadExample.count:Ljava/lang/Integer;
  #17 = NameAndType        #5:#6          // count:Ljava/lang/Integer;
  #18 = Utf8               LineNumberTable
  #19 = Utf8               LocalVariableTable
  #20 = Utf8               <init>
  #21 = Methodref          #3.#22         // java/lang/Object."<init>":()V
  #22 = NameAndType        #20:#8         // "<init>":()V
  #23 = Utf8               this
  #24 = Utf8               Lcom/thread/ThreadExample;
  #25 = Utf8               main
  #26 = Utf8               ([Ljava/lang/String;)V
  #27 = Methodref          #11.#28        // java/lang/Integer.intValue:()I
  #28 = NameAndType        #29:#30        // intValue:()I
  #29 = Utf8               intValue
  #30 = Utf8               ()I
  #31 = Utf8               args
  #32 = Utf8               [Ljava/lang/String;
  #33 = Utf8               StackMapTable
  #34 = Class              #32            // "[Ljava/lang/String;"
  #35 = Class              #36            // java/lang/Class
  #36 = Utf8               java/lang/Class
  #37 = Class              #38            // java/lang/Throwable
  #38 = Utf8               java/lang/Throwable
  #39 = Utf8               SourceFile
  #40 = Utf8               ThreadExample.java
{
  static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: bipush        25
         2: invokestatic  #10                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
         5: putstatic     #16                 // Field count:Ljava/lang/Integer;
         8: return
      LineNumberTable:
        line 6: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature

  public com.thread.ThreadExample();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #21                 // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/thread/ThreadExample;

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: ldc           #1                  // class com/thread/ThreadExample
         2: dup
         3: astore_1
         4: monitorenter
         5: getstatic     #16                 // Field count:Ljava/lang/Integer;
         8: invokevirtual #27                 // Method java/lang/Integer.intValue:()I
        11: iconst_1
        12: iadd
        13: invokestatic  #10                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        16: putstatic     #16                 // Field count:Ljava/lang/Integer;
        19: aload_1
        20: monitorexit
        21: goto          27
        24: aload_1
        25: monitorexit
        26: athrow
        27: return
      Exception table:
         from    to  target type
             5    21    24   any
            24    26    24   any
      LineNumberTable:
        line 12: 0
        line 13: 5
        line 12: 19
        line 15: 27
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      28     0  args   [Ljava/lang/String;
      StackMapTable: number_of_entries = 2
        frame_type = 255 /* full_frame */
          offset_delta = 24
          locals = [ class "[Ljava/lang/String;", class java/lang/Class ]
          stack = [ class java/lang/Throwable ]
        frame_type = 250 /* chop */
          offset_delta = 2
}
SourceFile: "ThreadExample.java"

C:\sts_workspace\concurrentInJava\bin\com\thread>

我们重点关注下,同步代码块:

可以看到monitorenter和monitorexit指令

**从上面的分析可以看出: 对象、对象的监视器、锁、线程 这几者之间的关系。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 本人主要是结合《Java多线程编程核心技术》这本书的第二章内容,对synchronized关键字的知识进行梳...
    码字与律动阅读 963评论 0 4
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,848评论 11 349
  • 比特率 bps(bits per second),即比特率、比特/秒、位/秒、每秒传送位数,数据传输速率的常用单位...
    onlyHalfSoul阅读 2,340评论 0 0
  • 有没有人和我一样从一个詹黑渐渐变成了詹蜜?今天我彻底变成了詹蜜。 虽然詹姆斯刚进联盟就被冠以天之骄子的称号,虽然他...
    页尤YEO阅读 598评论 10 8
  • 这次进藏自驾游,家里最熊的孩子跟着一块儿去。 一路上看着他爹在他身上心力交瘁而无能为力。 今天在车上的ipad之争...
    理想主义者的日常阅读 329评论 0 0

友情链接更多精彩内容