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底层实现原理的文章就介绍到这了,更多相关synchronized底层内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 基于Java实现记事本功能
- Android 滑动定位+吸附悬停效果实现
- 我用四种方式实现某场所码箭头动画(css3+canvas+svg+js)讲解超详细
- Spring Cloud使用Ribbon实现客户端负载平衡
- java如何实现自动生成数据库设计文档
- Android静默安装及开机自启的简单实现
- 安卓手势密码设置的实现
- js+canvas实现飞机大战
- 【mq】从零开始实现 mq-07-负载均衡 load balance
- Android tabLayout+recyclerView实现锚点定位