synchronized底层实现原理
测试类:
public class SynchronizedTest {
public void get() {
synchronized (this) {
System.out.println("小张你好鸭!");
}
}
}字节码文件(怎么看?? idea => view => Show ByteCode)

再来说原理:
基于对象的监视器(ObjectMonitor),我们在字节码文件里面可以看到,在同步方法执行前后,有两个指令,进入同步方法前monitorenter,方法执行完成后monitorexit;
我的理解是对象都有一个监视器ObjectMonitor,这个监视器内部有很多属性,比如当前等待线程数、计数器、当前所属线程等;其中计数器属性就是用来记录是否已被线程占有,方法执行到monitorenter时,计数器+1,执行到monitorexit时,计数器-1,线程就是通过这个计数器来判断当前锁对象是否已被占用(0为未占用,此时可以获取锁);
补充:一个synchronize锁会有两个monitorexit,这是保证synchronize能一定释放锁的机制,一个是方法正常执行完释放,一个是执行过程发生异常时虚拟机释放;
到此这篇关于synchronized底层实现原理的文章就介绍到这了,更多相关synchronized底层内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
深入浅析java web log4j 配置及在web项目中配置Log4j的技巧
这篇文章主要介绍了2015-11-11
springboot2.1.3配置sftp自定义sftp连接池的详细过程
这篇文章主要介绍了springboot2.1.3配置sftp自定义sftp连接池的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-08-08
MyBatis与SpringMVC相结合实现文件上传、下载功能
这篇文章主要介绍了MyBatis与SpringMVC相结合实现文件上传、下载功能的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下2016-06-06


最新评论