Synchronized:对对象进行加锁操作
public class Demo5 {
public static void main(String[] args) {
int i = 10;
Lock lock = new Lock();
synchronized (lock) {
System.out.println(i);
}
}
}
class Lock{}
对应的字节码:
Code:
stack=2, locals=5, args_size=1
0: new #2 //new Object
3: dup //复制一份,放到操作数栈顶,用于构造函数消耗
4: invokespecial #1 // Method com/nyima/JVM/day06/Lock."<init>":()V
7: astore_1 //剩下的一份放到局部变量表的1号位置,赋值给lock
8: aload_1 //lock对象的引用加载到操作数栈 (Synchronized开始)
9: dup //复制lock对象的引用,用于加锁和解锁
10:astore_2 //lock对象的引用加载到2号槽位
11: monitorenter //对lock引用所指向的对象加锁,消耗一个lock引用
12: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
15:ldc #4
17: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
20: aload_2 //2号槽位的lock对象的引用加载到操作数栈
21: monitorexit //解锁
22: goto 30
25: astore_3 //将异常对象的引用存入slot 3槽位
26: aload_2 //2号槽位的lock对象的引用加载到操作数栈
27: monitorexit //解锁
31: aload_3
33: athrow
34: return //可以看出,无论何时出现异常,都会跳转到25行,将异常放入局部变量中,并进行解锁操作,然后加载异常并抛出异常。
Exception table:
from to target type
12 22 25 any
25 28 25 any
方法级别的Synchronized不会在字节码指令中体现