synchronized锁升级过程 锁重入过程

先简单说下普通对象内存分布


image.png

锁升级过程:
无锁态-偏向锁-轻量锁-重量锁
1个字节等于8个比特(1Byte=8bit) 位(bit)


image.png
image.png

偏向锁:记录上次线程指针,用54位
若有其它线程竞争升级轻量锁,各自线程栈生成LockRecord,拿它去抢锁,自选方式CAS抢;
轻量锁:指向线程栈中的LockRecord的指针 用62位
1.6之前竞争再加剧,有线程超过10次自旋 -XX:PreBlockSpin可设置,或者自旋线程超过一半,1.6后由JVM自适应
升级重量锁:向操作系统申请资源,拿不到锁的线程挂起,进入等待队列WaitSet(不消耗资源),等待系统调度(CFS完全公平策略)。

字节码 monitorenter monitorexit

锁重入:
重入次数记录:用于加锁,重入,解锁记录
偏向锁:在线程——》栈中 LockRecord + 1个LockRecord
轻量级:类似也是 LockRecord + 1个
重量级:会记录在ObjectMonitor的字段上
happen-before原则 :如果A happens-before B,则A的执行结果对B可见,并且A的执行顺序先于B。线程A先对共享变量A进行加一,由happens-before关系可知线程A的执行结果对线程B可见即线程B所读取到的a的值为1。
锁消除


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容