00:00
好,同学们前面给大家介绍了轻量级所的理论知识,那么接下来我们就要用代码给大家证明一下我们这个轻量级所如何获得,那么通过前面的讲解,如果有印象的同学。应该会明白,我们这儿可以用一个取巧的方法,如果关闭偏向所,那么是不是就可以直接一步到位进入到轻量极所,那么给大家证明轻量级所存不存在,以及对应的所标之位,它最后两位是不是零零,OK,好,那么来吧,代码呢,也很简单啊,大家呢可以直接看一下,基本上就是定义一个对象,我不借啊,不管你定义在外面还是里面都可以,然后呢,T1这个线程,或者你直接用内线程,只要连带着这个参数,那就是关闭偏向所,直接默认进入轻量极所,我们大家可以看到最后两位是不是就是零零,好,那么同学们,我们给大家呢,做一下简单的演示啊。好。搁到这儿,那么new object还是以前的,那么来吧。
01:03
这个时候呢,我们呢,SYNCH。来。这些呢,大家呢都很熟悉了,我们呢就不再做过多的解释了,好。做一下简单的配置,那么对于它添加我们GVGVM的这个参数。关闭偏向组好一关闭以后,那么这个时候同学们lower眼看看能不能直接捅到我们的轻量级所,看一下后面大眼是不是就是我们的零零。那么从这。我们都清楚64位对吧,是这么多,那么每八位都是从左向右这么小点小点的看,那么最后两位大家请看零零跟我们的坐标智慧是一样的,OK,好,那么从这我们可以用代码。验证了我们的偏向所确实存在。最后的mark word标志最后两位也。一一符合我们的要求和规定,那么接下来我们来结合前面的天下所,再到我们的计量所,我们来给大家呢做一下。
02:06
相关的讲解和说明,前面我们呢都晓得。如果啊,这个偏向锁,它慢慢的不行了,它会捅到我们的什么轻量级锁,OK,那么第一种假设目前锁的状态啊,是轻量级锁红线这个,那么这叫做什么CS操作,这是第一种,第二种就是前面所说的。假设这个偏向所它在不在同步块里面,如果还在同步块执行中,升级为轻量极所,原持有偏向所的线程A就获得了轻量级锁,然后呢,从安全安全点呢继续执行,但是现在外面也来了一个里面它自己在大家进行CS的操作,如果CS成功了,谁成功谁上位获取这线索执行同块,但是如果失败呢,我们就要在外面干嘛。自学,如果自学成功了,那么OK,我也上位,那比如说啊,就像这样的,嗯,非常和谐,近乎交替执行,这样A进来,B在外面自询,B要到的时候,A刚刚用完,B又进去,ABBAB这样的近乎交替的,那么这个好说,可问题是假设。
03:17
没有那么多好事,天不遂人愿呢,那么抱歉,他有个上限,那么这个时候同学们请看。自选锁在这儿。轻量锁在这儿呢?轻量锁这儿其实就是自学的一种CS的状态表现,自学达到一定次数以后依然没有成功呢,那么弟兄们我这自学啊,假设不是这么近乎交替,那么和谐A在里面时间长了,BCDFG来的越来越多,而且等待的也越来越时间长了呢,竞争越来越激烈了,那么这个时候它自旋到达一定次数依然没有成功的时候就会升级,为什么重量级所好,那么下面我们在轻量级所这一章,我们就要说一下他在这块自学,那么你到底。
04:00
自学到一定次数,那是几次啊?是五次啊,还是十次还是20次啊,你自学到什么样一种条件和标准才会升级为重量级数?好,那么同学们在这儿,那么请跟着我来。首先我们呢,要明白,当自旋达到一定次数和程度的时候呢,它才会升为什么重量级所,那么这个自旋轻量级所这个状态。有两种,第一个在JAVA6之前啊,默认是启用。默认情况下自旋的次数是几十次啊,也即你在这自旋自旋啊,如果说自旋了十次啊,还是没抢到所那。掀桌子了,升级轻量锁升级为重量锁,那么这个时候大家可以用什么?这个参数,比如说你觉得十次是多还是少来进行修改,那么第二种情况呢,是或者呢,自选的线程数超过了CPU核磁的一半,那么上述你了解一下就行,1万实际工作中不应该会有人去配这个自旋的次数,你用默认的就行了,而且几按JAVA6之前也就说在这块啊,同学们了解一下就行了,我们只是为了知识的完整性。
05:13
六之前默认是十错,默认是十次或者超过CPU核数的一半,那么现在都是JAVA8了。那么在这。自适应自选锁的大致原理,那么在这一块的话呢,它是这么干的,自选锁它的原理是线程如果自旋成功了,那下次咨询的最大次数会增加,因为gbm认为既然上次成功了,那么这一次啊也很大概率会成功,反之啊。如果很少会自学成功,那么下次会减少自学的次数,甚至不自学,避免CPU空转。这是什么意思呢?来,先读一遍这个原理,我先告诉你,JAVA6之后,Java虚拟机非常的聪明,做了底层优化,它不再以固定速,而是这样的。他干的活叫自适应,来决定是否这个自旋的次数和程度是否到一定程度,以后是否要从轻量所升级成重量所。什么意思呢?它是用一种自适应自旋锁的原理来解决这个问题。
06:13
自适应就意味着自旋的次数不是每次固定不变的,而是根据。同一个所上一次咨询的时间拥有所线程的状态来决定,那么再回头来读这句话,走分走是这样的,它自适应,自我有一个就像是自我学习的一个过程。那么现在到底选几次升级?如果自选成功了,那么下次选次数就会增大,比如说这次我可能选了八次就成功了。那么根据我们以往的经验,你。到八次啊,就能咨询成功,那么现在我再比八次多一点,那么这样我成功的概率是不是就会更比上一次更大,OK,那么相反,如果很少咨询成功,那比如说啊,我已经做到七次了,都不会自学成功,那么这个时候我也会发现什么。
07:03
我们就别再费功夫了,其次啊,都不行,那么干脆减少自身的次数,甚至不要自旋了,避免CPU空转,节约性能,咱们找重量级锁一下,OK,所以说这个就叫自适应,他每次次数。不是固定的,不像JAVA6之前默认是十次,这没有,它底层会进行这样的,就像是AI的一样的智能匹配,那么当然这个不是由我们来控制Java虚拟机底层做的优化好,所以说在这块我们就给同学们说一下,自学到达一定次数的程度以后,就是这句话。自旋达到一定的次数,依然没有成功的时候,那么怎么来知道这个上限和下限,JAVA6和JAVA6之前和JAVA6之后他们的条件,所以说升级重量所就在这一小行,它是有这些条件的,OK,那么从JAVA6的默认十次。到加了六之后,我们自适应OK,好,那么最后一个问题,那么轻量所和偏向所的区别和根本的不同是什么呢?来,首先。
08:04
争夺轻,因为偏向锁没有人争夺,就一个OK,第二个争夺轻量所失败的时候,自选锁尝试强锁,这是他们两个第一点,也记偏向只有一个轻量两个以上了,那么这个时候失败的那个会尝试自选第二个轻量,其锁是每次退出同步块的时候都会释放锁,但是偏向锁是在竞争发生的时候才会释放锁,我们说过了只有一个的时候避免反复的切换,几乎这个同步就对它透明失效了,单向透明单向失效,所以不用反复的这么干。开启示范,开启示范,但是轻量级锁不是这样的,它每次退出都需要示范锁,那么成本自然而然要比偏向锁高这么一点点,OK,好,那么同学们,这个就是我们的轻量级锁。
我来说两句