java wait 释放锁_Java thread synchronized wait 搭配使用,释放锁的一个问题?

本文详细探讨了Java中wait()方法如何释放锁,从抽象层、字节码层和JVM源码层进行了解析。指出wait()会导致线程从RUNNABLE状态转变为WAIT状态,释放锁并进入等待队列。在ObjectMonitor的exit方法中,通过特定的原子操作释放锁。同时,文章引发思考,讨论了JVM锁在操作系统层面的表现以及不同锁的权重差异。
摘要由CSDN通过智能技术生成

从字节码上来看,看不出线程进入 wait 状态后,释放锁。

你在这段代码里当然看不出来了,invokevirtual #2这句已经在栈中压入了wait方法,释放锁的代码肯定要去wait方法里看。那虚拟机是怎么实现的呢?

你这个问题其实很复杂,可以从几个层面解答。

抽象层:

相信这个图很多人都看过,这是在抽象层面上,synchronized的工作原理,当然图中并没有涉及到锁的膨胀这一概念。调用wait()方法时,线程会被挂起,放入WaitSet中等待被notify/notifyAll唤醒,锁的释放就是在这个过程中实现的。

字节码层:

一般来说,我们都直接看JVM源码或JDK源码,看字节码的情况比较少。但既然这个问题中你提到了字节码,那么我们就从字节码说起。aload_0,invokevirtual #2,这两句相当于调用了this.wait(),也就是Object.wait()方法,字节码如下:

可以看到这个方法也没有包含释放锁的逻辑,而是调用了Object.wait(long)这个重载方法,aload_0,lconst_0,invokevirtual #15,这三句合起来的意思就是this.wait(0L)。Object.wait(long)方法的字节码如下:

想必你也看出来了,这里直接调用了本地C++方法,所以在字节码中是找不到你要的答案的。

这也是一些初学者的认识误区,以为JVM的逻辑都在字节码中执行。其

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值