00:00
各位同学大家好,通过前面的讲解,我们对偏向所的理论知识应该是入门加熟悉了,那么接下来老规矩进入到我们的第二个环节,我们需要用代码命令给大家深度解析。证明一下这个马二的对象头后面这些位数相关的变化和相关的所标志位的升级,好,那么同学们,我们呢,接着来,首先先来看一下偏向所。Gbm底层涉及到的命令。第一个。先来看这么一个命令函。那么这个呢,是给你打印出来Java虚拟机,它初始化所代表的一些参数,在这一圈。竖线。分隔符Linux命令lock给我查找。偏向所相关的内容,好,那么同学们,我们呢,打开我们的Linux窗口。这个命令直接粘贴。是偏向锁的意思啊,那么也就是说在Java虚拟机启动的时候,凡是涉及到偏向所相关的就这么多,那么注意product服务器级别产品系列这样的说明是什么,正式生产商可以用的好,那么在这儿我们要注意两个,第一个。
01:15
本次我们讲解一再强调过是以JAVA8这个版本,所以JAVA8这个版本作为企业级产品级的这样的一个对外发布的GDK,它是否使用?偏向锁默认是错是打开的,这是第一个问题,第二个偏向锁启动的话有延时几秒四秒钟,也就是说如果说你要用偏向锁的话。你需要自己停滞。四秒钟以上才能启动偏向锁,它开启了,但它并不是一开启就马上使用,有一个延时的效果,那么所以说你要想看到偏向所所产生的效果,两种方法,第一个。你把延时从四秒钟修改为零秒,要求你马上启动第二种,你不做任何Java虚拟机后面相关参数的变更和修改,但是呢,在程序启动的时候,你故意。
02:12
比如说thread.sleep线程休眠时间超过这个四秒钟,让它启动,OK,好,我们这儿呢,先给大家理论上说明白,那么也就是告诉大家偏向所确确实实是存在的,OK,但是有四秒钟的延时,这是我们的第一个结论,那么第二个我们来看一眼啊。锁的升级没有锁,第二种是什么偏向,我们前面强调了。偏向啊,意思就是说不管你是多少个线程来访问,一般情况下长期占有这个资源类的,可能偏心偏向于同一个线程,OK,那么这样就避免了反复的加锁解锁,用户态,内核态的切换,那这个时候我们来看一下,根据刚才我们的。GDK。结合Java虚拟机初始化参数列表,JAVA6已之后默认是什么开启,那我们前面。
03:08
看到过默认是不是错,是开启的,本次我们是JAVA8,从JAVA6开始它就默认是开启了,但是启动时间是有延时的,所以你如果想看到偏向左这个效果。那就需要对这个参数把启动时间做一个设置啊,由默认的四秒钟就是4000,那个启动时间变成零,那么也就是说不要延时啊,我需要你立刻启动。那么我们在开启偏向锁的话,一般啊使用这个代表开是否开启偏向锁,默认从加法六以后就直接开启,刚才我们的命令也看到了第二个,我们想立刻看到偏向左的效果,就把它的延时状态从默认的4000变成零,好这是开启偏向锁,第二种呢叫关闭偏向锁,那么注意。
04:00
1234啊,就像是读小学跳级一样,你把二年级给关了,那么直接就会跳到轻量级所,那么如何关闭呢?大家看加号开启减号就是关闭,OK,所以说如果没有偏向所那么好续,接下来直接就跳到轻量级所,OK,那么这是相关的理论知识,那么接下来。我们呢,通过代码给大家进行一下讲解和演示,首先啊。我们呢,这个是偏向锁老规矩拗了一个对象,那现在这个对象我们呢,也没有去调用它的哈希编码来,现在有且仅有一个线程,那么也就是我们的内线程这波没问题吧,那么各位同学。大家请看一下,那么。Layout。这个不多废话,都是大家很熟悉的了,那么大家请看现在是什么?有且仅有一个线程,就是我们的main线程,那么来只有一个线程,来反问这个O100%,它应该是一个偏向所吧,对吧?那么来吧。
05:08
一个现场的访问,没有激烈的竞争。第一次100次,1000次都是你,那么所以说来看看我们的效果。大家请看一下,我们最后是。多少位?000。诶。来吧。各位同学,我们可以看到。000对着我们而言。是轻量级锁呀,可我们现在想模拟的是偏向锁,应该尾号是101啊,那么也就是我们一切按照默认的话,同学们会发现演示没有效果。大家请看最后三位是000偏向所数据不对。000是什么轻量级所?那么这个时候是为什么呢?同学们请思考一下,能获得答案吗?结合前面我们讲的Java虚拟机的命令,那么来接看一下谜底,前面强调过。
06:09
我们一开始这是有延时四秒的默认相当于你偏向所要启动可能是需要四秒钟以后才有效果。那么。类似于你虽然说开启偏向锁默认,但是并没有使用,所以间接的类似于关闭,那么程序会直接变成什么新量级锁,OK,所以说各位同学,我们后台打印出来的就是000,好,那么来。结合这我们的系统参数,它的开启作用是这样的,偏向锁必须得是101,但是现在我们后台打印的是000 OK,那么理由是这样的。默认开始。这个是关闭,但是关闭延迟以后才说明什么,偏向所有登台唱戏的机会。所以我们现在。
07:04
要做的事情就是要对启动偏向左这个延时来进行一下处理和关闭。那么来。我们呢得到我们的结论,待会来演示就需要用这个参数来把延时呢给关掉,那么如果确定锁通常处于竞争状态,我们可以通过Java虚拟这个参数把偏向锁给关闭,那么默认就会进入什么轻量级锁,也就是假设你评估现在这个系统。竞争压力非常大,可以不用偏向所这一步了,因为很少的线程,线程会第一个获得,那么我直接捅到轻量级所也是可以,不过这个基本上啊,说明一下即可。让Java虚拟机自我优化,OK来,那么同学们,所以说我们现在要关闭延时参数来启用这个功能来吧。同学们请看,要把它变为零了以后立刻看到,我们才能看到101这个效果,那么如何处理呢?来,同学们。
08:03
搁到这儿,我们编辑一下我们的对应的这个类,添加Java虚拟机的参数。将我们的参数粘贴由4000变成零,马上启动好,同学们还是熟悉的配方,还是熟悉的味道,这个时候说明什么?我们立刻给它启动。来大家看看效果。看一下后台运行如何,是不是马上就变成了101,同学们没有任何问题吧,那么101对应着我们的是不是就叫我们的偏向所OK,那么其他的这些地方,那么存的也就是我们当前线程指针的Java线程指针,OK,好,那么这个呢,就是我们的什么第一种。对应的方法,那么就把这个参数一张即可,OK,好。
我来说两句