00:00
接着呀,咱们来看第二个代码优化的策略啊,这呢称为呢叫同步省略,哎同步省略,所以呀,如果一个对象哎被发现呢,只能够从一个线程当中被访问到,那么对于这个对象的操作啊,就可以考虑呢,就不用同步了。啊,这个呢,大家猛一下看到了,可能有点懵是吧,什么意思呢?来咱们找一下对应的这个说明。哎,首先呢,我们指出这个线能的同步的代价呢,是相当高的啊,同步的后果呢,就是降低了并发性和性能啊,这个呢应该很好理解,不用多解释对吧?啊,这个同步的话呢,我们相当于就变成了一个串行的操作了,那显然的话呢,就不能够,呃,有这个并发的一个形成更好啊,那下边来判断说呢,我们在进行动态编译同步代码块的时候呢,Git编译器可以借助呢,叫逃逸分析啊,借助这个逃逸分析呢,来判断说呢,这个同步代码块所使用的这个锁对象啊,就是我们所谓的叫同步监视器,它呀是否只能够被一个线程访问。啊,只能够被这一个线程方面,而不会这个发布到其他的线程当中,如果要是这样的行为的话呢,咱们就可以把这个所对象啊给它消除啊,这就叫做同步省略,也称为呢叫做锁消除。
01:10
哎,就这样,那好处呢,就是提高了这个并发性和性能是吧,哎这块已经提到了,哎举个例子啊,哎,大家呢,看我这个代码。这呢是我们一个方法,方法里边呢,咱们定义了一个对象啊,这个对象按照我们,诶前面提到的这个逃逸分析的话呢,它就属于没有发生逃逸的,对吧?那么我们把这个对象呢,就是作为我们这个同步接然器呢,放到这个CNE当中,哎,这呢是一个同步代码块。那我们说呀,这个代码咱们呢,就可以考虑给它优化成这个样子。啊,那这俩的区别呢,就是我们把这个同步操纵呢,是不是给去掉了。对吧?哎,那为什么能去这个大家呢,其实你想也能想明白啊,咱们上这个上面这个代码操作,即使在我们没有讲逃逸分析啊,没有讲这个同步省略的时候呢,实际上呢,咱们这个代码这样写啊,是不是也是有问题的呀。怎么讲,咱们说这是一个共享数据,咱们呢有两个线程来操作的一个共享数据,咱们呢考虑用一个同步代码块给它包一下,但是要求这两个线程呢,是不是共用的是同一个同步计然器啊。
02:12
啊,或者我们说明这个叫锁,大家得用同一个啊,否则的话呢,你这个枷锁就没有意义了,那这时候大家看啊,当我们这个一个线程来调它的时候呢,里边我们用的这个同步监视器是你限钮的一个,那我要另外一个线程也来调,这个方法是不是又是你限钮的一个。也就是说本身我们如果是多个线程来操作这个方法的时候呢,本身你这块呢,也起不到一个同步的效果。因为呢,你用的同步监视器呢,不是同一个,就本身这个代码呢,其实我们这加同步是不是也没有意义,哎,既然如此,实际上呢,你就直接干掉就完了。哎,我从另外的一个角度呢,也做了一个解释啊,当然这块呢,我们想强调就是说我们这个在执行的时候呢,咱们Java虚拟机通过这个叫呃逃逸分析,自动的就会帮我们把这个同步操作给去掉。啊,那如果说咱们开发中呢,你这样写代码跟这样写代码有没有区别呢?还是有点区别的,就是这个性能还是要差一些的,因为你毕竟还涉及到握这个锁的问题,是吧?诶性能还是要稍微差一点,那就不如呢直接就去掉,但你要代码都没去呢,我们说GVM虚拟机如果有了这个套逸分析呢,它会自动的帮你去掉,还是会有一定的好处,是吧,就是我们写的时候呢,你需要注意这个问题啊好,那这块呢,把这个事呢,实际上我们就说清楚了,诶然后这块还是想给大家再演示说明另外一个小细节啊,就这呢,是我把这个,诶刚才写的这个例子呢,就拿到这儿了,哎拿到这以后呢,关于同步审命这块说明我们先呢做一个编译。
03:36
诶编译好了是吧,那编译好以后的话呢,以后的话呢,我们把这个自节码文件呢,给它做一个反编译,反编译的话呢,一方面咱们可以使用这个JARP的指令啊,另外呢,还可以比较简单的,我直接呢,是不是就点一下我们这个杰拉lab是吧?诶在这也能看到,针对于咱们这个F方法,大家打开我想看一下这里边的代码。哎,主要呢,想给大家说明是什么问题啊,就是咱们现在的话呢,是不是看的这叫资金码文件,咱们所谓的呢,说啊你这个叫同步省略啊,你这个叫占上分配,咱们实际上是不是把我们这个自解码文件加载到内存中以后,咱们才进行的一个执行判断,是吧,当你要是看这个自检码文件的时候呢,这个大家注意,你这时候呢,仍然能够看到我们S的身影。
04:23
呃,我们从自解码的角度来说的话呢,就是这个叫monitor enter和monitor ex,诶这两个呢,对应的其实就是我们这个S,它的一个作用范围,它的开始和结束。诶,这个大家,诶这块有一个monitor test是吧?Ex,诶这块呢,大家要关注一下这个问题。啊,就是说我们重看磁金码文件的时候呢,照样还是有这个吸风奈的身影,只是在我们运行的时候呢,咱们才考虑呢,会把它去掉啊OK,大家体会一下,这呢,就是我们要给大家解释的,这叫诶同步省略,或者呢叫所消除。
我来说两句