首页 > 编程知识 正文

javajson解析,头歌java面向对象

时间:2023-05-05 03:21:44 阅读:126368 作者:3699

一:对象头

在HotSpot虚拟机中,对象存储在内存中的布局分为三个区域:“对象头”、“实例数据”和“对齐填充”。

HotSpot虚拟机的对象头包括散列码HashCode、GC世代年龄、锁定状态标志、线程具有的锁定、偏转线程ID、偏转时间戳等对象此部分的数据长度为32位和64位虚拟机) )不考虑打开压缩

需要存储在对象上的运行时数据很多,实际上超过了32、64位Bitmap结构所能记录的限度,但对象标头信息是与对象自身定义的数据无关的额外存储成本,是虚拟机的空间fzdlt Word旨在在非常小的空间中存储尽可能多的信息,根据对象的状态复用自己的存储空间。 例如,在32位HotSpot虚拟机上的对象未锁定的情况下,fzdlt Word的2Bits空间中的25Bits存储对象哈希代码,4Bits存储对象的分代年龄

对象标头的另一部分是对象指向该类的元数据的指针,虚拟机使用该指针来确定该对象是哪个类的实例。 并非所有虚拟机实现都需要在对象数据中保留类型指针。 也就是说,搜索对象的元数据信息不需要通过对象本身。 另外,如果对象是Java数组,则虚拟机可以根据常规Java对象的元数据信息确定Java对象的大小,但无法根据数组的元数据确定数组的大小,因此用于在对象标题中记录数组长度的数据

这里值得注意的是,锁标志位, 锁定标志的位是否偏向于锁定对应于唯一的锁定状态。

所以锁定的状态保存在对象的头上,我理解

同步到底锁定的是什么,锁定的是代码还是对象)。 在java中,对象被锁定。 是怎么实施的?

这两个问题,我很明白!

二:锁的状态

锁定的状态有无锁定状态、偏转锁定、轻量锁定、重量锁定4种。 随着锁定的竞争,锁定可以从偏转锁定升级为轻型锁定,再升级为升级后的重量锁定。 (但是,锁升级是单向的,即只能从较低级别升级到较高级别,而不会发生锁升级。 默认情况下,JDK 1.6启用偏转锁定和轻型锁定,但也可以在-XX:-UseBiasedLocking中禁用偏转锁定。

1、轻型锁定的锁定流程

(1)代码进入同步块时,同步对象的锁定状态为未锁定状态(锁定标志位为" 01 "状态,偏转锁定是否为"0" ) )时, 虚拟机首先创建一个名为“锁定记录”(Lock Record )的空间,用于在当前线程的堆栈帧中存储锁定对象的当前fzdlt Word副本,并创建线程堆栈和官方称为dispord

(2)将复制对象头中的fzdlt Word复制到锁定记录中。

)3)成功复制后,虚拟机将尝试使用CAS操作将对象的fzdlt Word更新为指向Lock Record的指针,并将Lock Record中的owner指针指向object mark word。 如果更新成功,请执行步骤(4),否则执行步骤(5)。

)4)如果该更新操作成功,则该线程具有该对象的锁定,并且对象fzdlt Word的锁定标志位设置为“00”表示该对象处于轻型锁定状态

)5)如果此更新操作失败,虚拟机将首先检查对象的fzdlt Word是否指向当前线程的堆栈帧,如果是,则表明当前线程已经有此对象的锁,保持同步否则,多个线程将竞争锁定,轻量级锁定膨胀到重量锁定,锁定标志的状态值为“10”,fzdlt Word存储指向重量锁定(独占量)的指针,后面等待锁定的线程也是块当前线程试图使用旋转获得锁定。 旋转是使用循环获取锁定以防止线程被阻止的过程。

图2.1轻型锁定CAS操作前堆栈和对象的状态

图2.2轻型锁定CAS操作后堆栈和对象的状态

三、偏向锁

t:10px;">  引入偏向锁是为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路径,因为轻量级锁的获取及释放依赖多次CAS原子指令,而偏向锁只需要在置换ThreadID的时候依赖一次CAS原子指令(由于一旦出现多线程竞争的情况就必须撤销偏向锁,所以偏向锁的撤销操作的性能损耗必须小于节省下来的CAS原子指令的性能消耗)。上面说过,轻量级锁是为了在线程交替执行同步块时提高性能,而偏向锁则是在只有一个线程执行同步块时进一步提高性能。

1、偏向锁获取过程:

  (1)访问fzdlt Word中偏向锁的标识是否设置成1,锁标志位是否为01——确认为可偏向状态。

  (2)如果为可偏向状态,则测试线程ID是否指向当前线程,如果是,进入步骤(5),否则进入步骤(3)。

  (3)如果线程ID并未指向当前线程,则通过CAS操作竞争锁。如果竞争成功,则将fzdlt Word中线程ID设置为当前线程ID,然后执行(5);如果竞争失败,执行(4)。

  (4)如果CAS获取偏向锁失败,则表示有竞争。当到达全局安全点(safepoint)时获得偏向锁的线程被挂起,偏向锁升级为轻量级锁,然后被阻塞在安全点的线程继续往下执行同步代码。

  (5)执行同步代码。

2、偏向锁的释放:

  偏向锁的撤销在上述第四步骤中有提到。偏向锁只有遇到其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁,线程不会主动去释放偏向锁。偏向锁的撤销,需要等待全局安全点(在这个时间点上没有字节码正在执行),它会首先暂停拥有偏向锁的线程,判断锁对象是否处于被锁定状态,撤销偏向锁后恢复到未锁定(标志位为“01”)或轻量级锁(标志位为“00”)的状态。

3、重量级锁、轻量级锁和偏向锁之间转换

 

 

该图主要是对上述内容的总结,如果对上述内容有较好的了解的话,该图应该很容易看懂。

 

 

 

参考资料:

      http://blog.csdn.net/u010723709/article/details/50341631

      http://www.cnblogs.com/paddix/p/5405678.html

      http://www.cnblogs.com/lingepeiyong/archive/2012/10/30/2745973.html

     

      

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。