在上面的lock_method()中,会在当前方法栈帧中分配一段空间,用于分配一个BasicObjectLock对象,这个对象主要干两件事,一是记录将要锁的对象指针,而是用一个字长的空间,复制锁对象的markOop.现在我们可能不知道这么做是为什么,但是后面就会清楚了。主要上面最后一步,调用了lock_object()进行加锁-潍坊达内负责整理
如果虚拟机参数允许使用偏向锁,那么会进入biased_locking_enter()中,biased_locking_enter()这个方法涉及到了很多细节,说实话在不了解这些细节的情况下直接看代码,简直是一头雾水。接下来还是一边看代码一边去讲解细节吧。
四:偏向锁的获取
()也比较长,就不直接贴方法块了,一步步分析比较好。
判断锁对象是否为偏向锁状态
走到这,表明锁对象已经为偏向锁态,需要判断锁对象之前是否已经偏向当前线程。
日夜开始会问,说代数差的肯定学JS吗?
信赖多数人都有此困惑,讲解这种震惊曾经,大家在准备看看一份数学题:两地距离1000米。贾童从A地以1.8米每秒的速度向B地走,危婷然从B地以每秒1.8米的速度向a走。请问:她们多久后再会?再会的地方离B地有多远?这是一道易明白小学数学题,潍坊达内培训告诉我们,然而对于代数不好的人,或许要很想很久。然而其实JS说不太注重你把解析结果写出来,你需要重视他的行动思维就行。

确实,要用JS来去这两块地方的震惊,你只需要当心个相比于易明白的代数原型︰即加、减、乘、除和求余就行,其实和会背公式会有些像。
多数人没进修JS的人,都认为代数不好,无法成为程序猿。其实代数跟JS的情感肯定分解为:精代数者,未必会JS,不精晓代数,也能进修JS,如欲精JS,必精代数,若已精晓代数者,学JS不难也。正因为这样,代数不好应是肯定学JS,然而会比代数好的人难,要有很大的顽强,之前是要多去攀升自己的行动和汇总力量。
走到这,表明锁对象并没有偏向当前线程,接下来判断是否需要撤销锁对象的偏向。
走到这,表明锁对象还支持偏向锁,需要判断当前对象的epoch是否合法,如果不合法,需要取进行重偏向。合法的话接着往下走。
走到这,表明锁对象的偏向态合法,可以尝试去获取锁,使对象偏向当前线程。
其实到这里,biased_locking_enter()已经结束了,不过上面多处提到了try_rebais和try_revoke,这两个其实就是汇编里的标号,它们对应的代码也定义在biased_locking_enter中。
五:总结
上面根据同步方法讲了一下偏向锁,笔者在这上面也啃了差不多整个周六,原理看似很简单,但是在很多细节不清楚的情况下去看源码,尤其是这种全是汇编代码时,往往是一脸懵逼。而且HotSpot用一个并不是对象的markOop去表示锁,涉及到计算时更让人糊涂。如果大家只是想稍微了解下原理,建议还是不要太深入源码细节。
以上就是潍坊达内给大家做的内容详解,更多关于UI的学习,请继续关注潍坊达内