时间:2021-05-20
对象内存布局
Java对象在内存中存储的布局可以分为3块区域: 对象头、实例数据、对齐填充。
对象头,分为两个部分,第一个部分存储对象自身的运行时数据,又称为Mark Word,32位虚拟机占32bit,64位虚拟机占64bit。如图所示,不同锁状态下,Mark Word的结构,理解下面要介绍的各种锁,和锁升级过程,都需要先充分了解Mark Word的结构。
第二部分是类型指针,指向类元数据指针,虚拟机通过此指针,确定该对象属于那个类的实例。
轻量级锁
轻量级锁是相对于重量级锁(Synchrnoized)而言的,本意是在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗。
轻量级锁的获取
线程进入同步块时,如果此同步对象没有被锁定(即锁标志位为01,是否为偏向锁为0),虚拟机在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的一个Mark Word的copy
然后虚拟机使用CAS操作,尝试将Mark World更新为指向Lock Record的指针,如果更新成功,那么线程拥有了该对象的锁,并且将锁标志位置位00,如图所示
一旦有两条以上的线程抢占该锁,轻量级锁会升级为重量级锁。锁标志位置为10,Mark Word存储的就是指向重量级锁的指针
轻量级锁释
偏向锁
引入偏向锁的目的是在没有多线程竞争的前提下,进一步减少线程同步的性能消耗。
偏向锁的获取
开启偏向锁模式后,锁第一次被线程获取的时候,虚拟机会把对象头中是否为偏向锁的标志位设位0,同时使用CAS操作把获取到这个锁的线程的ID记录在对象的Mark Word之中。
当有另外一个线程去尝试获取这个锁时, 偏向模式就宣告结束。 根据锁对象目前是否处于被锁定的状态, 撤销偏向( Revoke Bias) 后恢复到未锁定( 标志位为“01”)或轻量级锁定( 标志位为“00”) 的状态
偏向锁的释放
偏向锁,并没有显式的锁释放过程,主要依靠锁的批量再偏向(Bulk Rebias)机制实现锁释放。
该机制的主要工作原理如下:
整个锁升级过程
参考文章
偏向锁,轻量级锁与重量级锁的区别与膨胀
Java中的偏向锁,轻量级锁, 重量级锁解析
到此这篇关于Java锁升级的实现过程的文章就介绍到这了,更多相关Java锁升级内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
java文件锁的简单实现java文件锁的功能,隐私文件及安全性的提升,实现起来不难,这里贴下实现代码:实例代码:importjava.io.File;impor
Java5在java.util.concurrent包中已经包含了读写锁。尽管如此,我们还是应该了解其实现背后的原理。读/写锁的Java实现(Read/Writ
根据锁的添加到Java中的时间,Java中的锁,可以分为"同步锁"和"JUC包中的锁"。同步锁 即通过synchronized关键字来进行同步,实现对竞争资源
本文实例讲述了java乐观锁原理与实现。分享给大家供大家参考,具体如下:简单说说乐观锁。乐观锁是相对于悲观锁而言。悲观锁认为,这个线程,发生并发的可能性极大,线
在[高并发Java一]前言中已经提到了无锁的概念,由于在jdk源码中有大量的无锁应用,所以在这里介绍下无锁。1无锁类的原理详解1.1CASCAS算法的过程是这样