一。Synchronized的底层实现原理 比如我们使用Synchronized修饰代码块,使用javap -c test.class进行反编译,会发现有mintorenter和monitorexit,当程序进入同步代码块中,获取到同步锁,线程会执行minitorenter指令获取minitor所有权,然后将进入数设置为1,如果是重新进入,进入数加一。当获取minitorexit指令时,进入数减一,当进入数为0时,退出minitor。反编译文件中有两个minitorexit指令,原因就是如果进入minitor后发生异常,导致锁没有释放,就会发生死锁,最后一个minitorexit就是为了防止发生死锁从而导致线程不会释放锁。 当Synchronized修饰方法时,通过反编译查看class文件会发现,没有minitorenter和minitorexit这两个指令,常量池中多了一个ACC_SYNCHRONIZED,表示线程进入方法后首先应该获取minitorenter,退出要获取minitorexit指令,不过是两种表现方式,意义都是一样的。
点赞 评论

相关推荐

牛客网
牛客企业服务