【java并发系列】探知synchronized 底层实现原理

大家好,我是walker
一个从文科自学转行的程序员~
爱好编程,偶尔写写编程文章和生活
欢迎关注公众号【I am Walker】,回复“电子书”,就可以获得200多本编程相关电子书哈~
我的gitee:https://gitee.com/shen-chuhao/walker.git 里面很多技术案例!

synchronized是Java中的一个关键字,在使用的过程中并没有看到显示的加锁和解锁过程。
因此有必要通过javap命令,查看相应的字节码文件。
synchronized 同步语句块的情况

查找案例

1、编写测试类

package synchronizedTest;

public class SynchronizedTheory {
    public void getTheory(){
        synchronized (this){
            System.out.println("执行代码块");
        }
    }

    public static void main(String[] args) {
        SynchronizedTheory synchronizedTheory = new SynchronizedTheory();
        synchronizedTheory.getTheory();
    }
}

注意:这里在编写之后,需要先执行以下main方法,然后就会出现编译文件,如果不用这种方式的话,使用maven的package或者install也可以

2、找到对应的编译文件,注意不是.java文件,而是.class文件
image.png

3、进入到对应的文件下
image.png
4、按右键+shift键,点击powerShell
image.png
之后执行命令javap -c -v SynchronizedTheory

就会出现下面的结果了
image.png

这里可以发现,一开始有个monitorenter,之后有两个monitorexit指令,

为什么会有两个monitorexit呢?

这个主要是防止在同步代码块中线程因异常退出,而锁没有得到释放,这必然会造成死锁(等待的线程永远获取不到锁)。
因此最后一个monitorexit是保证在异常情况下,锁也可以得到释放,避免死锁。仅有ACC_SYNCHRONIZED这么一个标志,该标记表明线程进入该方法时,需要monitorenter,退出该方法时需要monitorexit。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WalkerShen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值