00:00
各位同学大家好,接下来再给大家追加一点高频的面试题,Git编译器对锁的优化,那么首先啊,这两个问题呢,经常会被问到,就是一什么叫所消除,二什么叫所粗化啊,名词嘛很高大上,其实底层嘛有点无聊啊,他完全是为了面试,感觉现在比较卷嘛,所以说呢,没办法,同学们呢,还是要了解好,首先来说一下GI什么意思。Just in time compare,一般翻译为即时编译器,那么下面也就是说我们在一定的这个程序编写的时候,也许语法上你没有编写错误,但是对于底层的编译器而言,它的理解跟你所想表现的意思可能不一样。好,那么下面请先看第一个案例,所谓的所消除,那么下面不说多的,先代码说话。首先十个线程来调用某个资源的话,那么当然要加锁,对吧?由于我们这是main方法是static,所以说我就定义一个static这么一个锁吧,它没什么东东啊,那么就是一个object,那么object lock等于new object,我相信这就是一把公用的锁,大家没有任何问题对吧?那么下面我干一件什么事呢?
01:16
我这儿呢,写了个public vo1,就这么一个方法,很简单啊,然后呢,我正常而言,我是不是应该是写这么一个弟兄们没问题吧。那么这。我们就哈假设这个就叫所消除这么一个DEMO,呃,大家可以看得出啊,这个呢,没有任何的这个额外的。技术含量了对吧,那么现在那么假设我们呢,就这么干。OK,十个线程,那么线程操纵资源类,那么这那么一,我相信这段代码同学们没有任何疑义,对吧?简单的没朋友,简单的不能再简单了,我们执行一下,大家请看右边的话呢,语法呢,也没有什么太多的问题,OK,好,那么这个跟我们所今天要讲的这个所谓的第一个知识点所消除有什么意思呢?
02:11
有什么关联呢?来,同学们请看,此时现在呢,我没像这么写了啊。这么写是可以的,现在呢?我干了这么一件蠢的事儿。我这么干,多线程总共有十个线程,要去线程操纵资源类,同一个对象里面的这个资源类,然后呢,调用这个M1这个方法,但在这个方法里面我又干了一件事,Object。New object。来这有个O听懂,那么SYNCH的。我把这个弄上去,那么同学们还是跟以前一样,这么说能跟上好,那么来啊,假设我现在啊。再明确一点,那么就是O点扣。没问题吧,那么来。再加上这么前面的这个。
03:02
Object还是扣那么啥意思啊?同学们请看啊,什么叫所消除?我现在相当于是多线程啊,在调用MG方法的时候,每进去了以后,他就给我了个对象。好,那么我们先不说破,那么同学们,你告诉我。这个code是一个值啊还是多个值啊,这个code是一个值啊,还是多个值,好同学们,我们跑一下十个线程啊,很简单。来,请大家看。如果说我用这个的时候,尾号都是5804,同一个哈code也就是同一个对象,而上面这个你会发现每一个都不一样,这个叫什么698,这个叫044,这个叫021,什么概念也记你这么写。虽然说语法上没有错,程序上也跑通了,但是这种情况下变成了什么,这个就会产生。
04:00
所消除问题就是GI编译器。那么也就是我们的什么G。编译器会无视他。因为弟兄们我们都明白啊,S加锁肯定是多个线程要抢同一个同步代码框里面的业务逻辑,我们只能说加同一把锁呀,你这样就变成什么,每个线程进来我用一个,每个线程我进来你用一个,那毫无意义啊,人手一部手机还加个什么鬼的锁呢,没有任何意义了。所以说这种情况下我们认为干嘛synchronized。那么也就是我们里面的这个。对象锁啊,也是我们这个小O,每次六出来这个小O。每次出来的那么干嘛。不存在的。OK,那么这个呢,是非正常的。好,再次强调啊,这个呢就叫所消除,就是你这么写没有意义了,呃,GI底层会无视它,那么虽然说啊,你表面上你在看写着语法没报错,但是这么写。
05:07
编译器的理解是认为你干了一件很无聊的事。因为一定是多个线程抢同一把锁嘛,你这是每次来一个自己用一个,每一个线程一个锁,每一个线程是一个锁,每一个线程一个锁,就有点类似于我们之前讲的local,自己每个线程自带一份,没有任何意义,OK好同学们,那么这种情况下来。从g it的角度来看,它相当于无视它,这个就已经不存在,这个锁对象并没有被共用,扩散到其他线程使用,极端的说,就是说根本没有加这个锁对象的底层机器码,消除了锁的作用,没有任何价值和意义,千万不要这么干,OK,好,那么同学们,这个就叫锁销。
我来说两句