00:00
各位同学大家好。首先。非常感谢大家能够跟着我完成了这一章,那么几乎已经接近尾声了。那么老规矩,但凡重要的。知识细节复杂繁琐,琐碎的面试中的高频考点,那么杨哥到最后一定会带着大家做一个陈述性的兜底的小总结,帮助大家梳理,那么第二个在学习过程当中也会引导并启发大家,看看有没有对应的疑问和担心来给大家呢?解惑,讲解清楚这个知识,那么接下来我们来看两个问题。第一个。必须也必然的,大家大家对四种所它的升级状态、策略变化,所标之外等等等等是怎么一个流程,需要给大家做一个小总结。第二个大家有没有思考过这么一个问题。对于我们的64位马ard,它的各种所标之位和是否偏向,在变化的过程当中有没有思考?无锁状态时候是有哈code的,如果这31位后面因为锁状态的升级和变化。
01:04
我要用到哈code,但是这个哈code已经被什么当前指针啊,线程站中的还有指向互斥量的指针所覆盖了,那么请问这个哈code去哪了?这是我们的第二个问题,那么带着这个疑问,希望同学们继续跟着我再辛苦的学习一下,我们这个总结还是比较重量级来。首先。所升级之后,请问哈code去哪了?明明在这儿有31位哈code调用的话,那么如果升到了偏向锁,那么当前指针是不是就把它覆盖了?那么请问我现在要用has code怎么办呢?所以说在这同学们漏眼。所升级为轻量所或重量所之后。马word对象标记中保存的分别是线程战帧中的所记录指针和重量级的所指针,也就是这个。和这个。好。已经没有位置再保存哈希玛了。
02:01
那么还包括我们的TC年龄哈,那么前面这些信息。被移除到哪儿了呢?那么下面请记住这句话,前面我们在升级的流程过程当中总结过。锁的指向请牢记,再来一遍。偏向所mawa中存储的是偏向的线程ID。这个。第二个指向县城站中locker的指针。这个第三一个指向堆中,注意这个是在站桩,这个是在堆中的模拟对象的指针。那么来。这个我们的管程重量级组嘛,好,这三个非常重要。那么接下来请听我。分析和拆解来。按照权威的Java虚拟机的书上面所说的啊,在Java语言中有一个对象,如果计注意计算过哈希玛,就应该一直保持该值不变。注意强烈推荐,但不强制啊,啥意思啊,翻译成人话。
03:00
如果你满18岁了,去派出所。计算过办理过身份证号,那么就应该正常而言,保持身份证号一直不变,但是你可以去修改这个身份证号,对吧?强烈推荐,但不强制,能理解这个意思吗?因为用户可以重载哈扣的方法,按自己的意愿返回哈希玛,那么意思就是说。你计算过这个哈西玛的话,尽量保持该值不变,哈希玛嘛,对象标志的一个素身份啊,哈西玛尽量不要。变化太过于频繁,否则啊,很多依赖对象哈希玛的API都可能调用出错,你的身份证号,你的手机号,你也不会天天变,对吧?那么而作为绝大多数对象的哈希玛来源就是我们object这个组宗类里面的个哈西code的方法,返回了这个对象的一致性哈希identity哈code,也就是我们的哈希玛啊,这个只要是能强制保证不变的,因为我们强调过哈希玛它底层是native方法,那么它通过在对象图中存储计算结果来保证第一次计算之后。
04:01
再次,调用该方法渠道的哈希玛永远不会再发生改变,以及我们默认大多数情况下,99.99%,你去公安派出所申请了一个身份证号码以后,那么就是用到。死那天为止了,对吧,好,因此啊,也跟这个Java程序一样。当一个对象已经计算过一致性哈希玛之后,他就再也无法进入什么偏向所的状态,这点非常重要。你只要算过哈西玛了,你不可以到偏向所,那么这样的话,是不是就不会出现哈西玛和我们的偏向所覆盖这个问题?好,而当一个对象当前正处于偏向所的状态。又收到需要计算一致性哈希玛就说假设我现在正处在偏向索,我要要求你在这个状态下面给我掏出来这个哈希玛,那么麻烦了,这个时候我呢,只好把偏向状态立刻撤销,并且所会膨胀,为什么重量极锁诶,那这儿没有哈希玛,难道重量极所有吗?
05:04
Yes,答案是肯定的,为什么?因为在重量极所的实验中,对象头指向了重量极所的位置,就是那个莫管程对象的那个指针,代表重量级所的object类中有字段可以记录,非加锁状态,就是标志为为零一下的这个马其中自然可以存储原来的哈希玛和我们对应的马库尔德当中对象头的那些年龄啊等等等,也记。有共享和拷贝,那么来把上面这段话我给大家做一下更进一步的翻译。无锁状态下,Micro word中存储对象头的哈code值。当我们对象的这个哈code方法第一次被调用,Java虚拟机就会生成对应的哈code并存到我们。这个31位,这这个已经给大家演示过过,接下来这个问题是对于偏向所啊,注意再读一个。当一个对象已经计算过一次哈希玛号。他就再也无法进入偏向状态,那么说明什么?这两个状态是不是不共存的?所以对于偏向所在线程获取偏向所的时候会用这个线程ID。
06:09
和这个你把它理解为一个时间戳啊,也就相当于说。总共应该是54位,再加这的两位,那么把它覆盖掉,OK,覆盖这个的位置。如果一个对象的哈code的方法已经被调用过一次之后,这个对象不能被设置为偏向所就是在这儿被调用过以后,再也无法进入偏向状态,因为如果可以的话,那么这个mark word当中对象图标记中的这个哈code,我们前面强调过哈code就应该一直保持不变,听懂,尽量生成一次以后就用就行了,别再长期变化。那么如果你。觉得它们可以覆反复覆盖,反复变化,那么就必然会被偏向线程的ID给覆盖,这样会造成同一个对象前后两次调用哈的方法得不到相同的结果,也即结果不一致啊。所以计算过一致性哈希码,然后就再也不要再进入偏向素的状态,因为会产生不必要的覆盖,导致编码错乱,好。
07:09
下面。那这个呢,偏向锁完了以后,那这个呢,轻量所和重量所呢,他们又怎么保存呢来注意。如果我们升级为轻量锁的时候,Java虚拟机会在当前线程的战争中创建一个所记录洛克record的这么一个空间,用于存储对象的ma的什么拷贝业绩啊,原来在这块指针当中,它会创建一个这么一个空间,OK,可以把它这块拷贝过来跟我共存,该拷贝中可以包含哈西code,所以轻量级所可以和这些什么马当中所标记的这些信息是共存的。那么所有的哈希玛。还有GC年龄都可以保存在这儿,释放锁之后会将这些信息写回到对象头,OK,那么好,那么轻量基锁也许又是一种无锁的状态,用完了对吧?我再把它写回去,好,这是轻量级锁,也即什么可以共存,那么重量级锁呢,一样。
08:09
马尔对象头呢,保存的这个重量级索的指针,代表重量级的这个莫尼塔,它里面也有字段记录,非加锁状态下的是吗?马克二的就是说相当于有个小本本也记着,我虽然说现在这前62位指向护士所重量检所指针,但是我也有这个是吗?有字段可以记录锁呢,释放以后也会将信息重新写回到。对象头,所以他们这两个是不会丢的,OK,那么理论上请同学们务必要明白,那么也就是我们的这段话以及对应的四种拆解好理论知识给大家。说到这儿,那么相信大家还是有点懵逼,那么接下来代码说话。
我来说两句