【JVM类加载及字节码技术】栈中的执行过程-Synchronized(五)

本文详细解析了Java虚拟机(JVM)中Synchronized的执行流程。通过案例代码和对应的字节码文件,展示了Synchronized如何进行加锁与解锁操作。即使在异常情况下,JVM也会确保正确解锁,保证了线程安全性。
摘要由CSDN通过智能技术生成


一、JVM中Synchronized

1.案例代码

代码如下(示例):

public class Demo5 {
	public static void main(String[] args) {
		int i = 10;
		Lock lock = new Lock();
		synchronized (lock) {
			System.out.println(i);
		}
	}
}

class Lock{}

2.对应字节码文件

代码如下(示例):

Code:
     stack=2, locals=5, args_size=1
        0: bipush        10
        2: istore_1
        3: new           #2             	 // class com/nyima/JVM/day06/Lock
        6: dup 						//复制一份,放到操作数栈顶,用于构造函数消耗
        7: invokespecial #3                  // Method com/nyima/JVM/day06/Lock."<init>":()V
       10: astore_2 				//剩下的一份放到局部变量表的2号位置
       11: aload_2 					//加载到操作数栈
       12: dup 						//复制一份,放到操作数栈,用于加锁时消耗
       13: astore_3 				//将操作数栈顶元素弹出,暂存到局部变量表的三号槽位。这时操作数栈中有一份对象的引用
       14: monitorenter 			//加锁
       //锁住后代码块中的操作    
       15: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
       18: iload_1
       19: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
       //加载局部变量表中三号槽位对象的引用,用于解锁    
       22: aload_3    
       23: monitorexit 				//解锁
       24: goto          34
       //异常操作    
       27: astore        4
       29: aload_3
       30: monitorexit 				//解锁
       31: aload         4
       33: athrow
       34: return
     //可以看出,无论何时出现异常,都会跳转到27行,将异常放入局部变量中,并进行解锁操作,然后加载异常并抛出异常。      
     Exception table:
        from    to  target type
           15    24    27   any
           27    31    27   any
  1. 0-2行指令,将10存入局部变量1号位

  2. 3-10行指令,创建一个对象并分配空间,然后复制一份引用放置在操作数栈,并消耗掉调用init方法,然后将剩下的一份放入局部变量2号位

  3. 11-13行指令,加载局部变量2号位到操作数栈,并且又复制一份,将复制的一份引用存入局部变量3号位,此时操作数栈还剩余一份,将用于加锁消耗

  4. 14-23行指令,加锁然后执行代码块中的指令,等待执行完,会加载局部变量3号位,中存储的引用,进行解锁。

  5. 27-33行指令,如果出现异常,也会进行加载局部变量3号位进行解锁。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了Synchronized在JVM中的执行流程。

  1. 加锁时会复制一份锁对象引用存储在局部变量表中用于解锁。
  2. 就算锁块中的代码出现异常也会将锁解除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值