案例代码
代码示例
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指令
**从上面的分析可以看出: 对象、对象的监视器、锁、线程 这几者之间的关系。