00:00
好,那么各位同学,我们接下来继续。前半场,那么给大家呢。说了一下,可见和原子那么注意哈。大的规范是GMM。那么。一般都要满足这三个,可见原子有序。但是呢,完了。可见。但是呢,原子不保证,那么至于说前面的一些证明,尤其是什么,我刚才讲过这个case写丢了啊,说白了就是什么,为什么比2万少出现了丢数字的值,那么。已经讲过了。我拿的时候干嘛?我们两个拿的时候都是三,我正准备写回去是四的时候,突然有人捷足先登了。我这被挂起,已经有人从三先写去四,而这个时候我又马上去写回去,那么相当于跟丢了一次O吧,啊,搞通了也没那么难,大家呢?那么接下来。得说个难题。
01:01
禁止指令铜排穴。这个。是在摩特尔特性里面最难的一个。那么它牵扯到一个happen before,就是先行发生原则,但是那个呢,由于太啰嗦,老师呢,不愿意给大家讲那么多,尤其是部分非算同学,那么杨哥呢,给你彻底讲什么精华的版本,你去背那八条,什么happen before,你背完了以后,就跟你背了化学元素周期表一样,还是搞不懂。那么,依旧严格的老规矩,真传一句话,假传万卷书。讲的越细越难越不懂,永远朴素的真理都是简单的。那么来,我们下面来看看,最终我们现场安全性获得保障,那么这是我们的小总结。我们下面来。有序。何为有序?不用讲12345678组建ID自增或对吧。很简单,但是呢,这个有序性来吧。
02:00
他限制到底层计算机的一个东西,如果学过你们班计算机系的,如果学过操作系统和汇编的,就会明白我说什么。为什么这块讲起来费劲呢?主要大部分的同学都是什么非算专业?有一种东西叫汇编。那么编译原理。那么这个时候它常常会对指令做重排,一般分为下面三种情况。我们写这个哈,点Java。巴啦巴啦,把它弄下去。你认为的代码顺序,比方说就有点类似于刚才我们呢,彻彻底底。整了一个什么东东,Java的这个,呃。Verbs,那么来,同学们看。我们干了这么一个事儿,你会明白哈,我们我们人写的Java是这样,但是机器执行的Java是不是这样啊。换句话说。什么叫指令重排呢?有点类似于。你在这儿写的,也许你的源代码写的是第20行,但是抱歉,正儿八经,操作系统去读的时候不见得是20行。
03:09
那么这个时候挺好,它会经过一种东西三步。为了保证快和执行的稳、准、狠,底层。会做。编译器优化。指令重排内存系统重排最终执行的指令。那言下之意就是单线程环境里面可以确保程序最终执行结果和代码的执行是果。你知道。数据在进行,也就是单,也就是说现在什么东西,什么环境。假设单线程就是大家三个月前只有个秘方法单线程环境,那么你也不用跟我讲什么瑞list,什么线程不安全。不会有事,因为是不是天大地大,就你一个人,没人跟你抢,你加不加锁,反正就你一个人不会错,也就是说。但是呢,现在我们进入了多核、多CPU、多并发的时代。
04:02
处理器在线出卖时,就要考虑指定基因的什么数据依赖性。来,有这个依赖了以后就是有点类似,什么叫数据依赖?最简单一句话,先有你爹才能有你。这个是一个逻辑顺序,没有哪个同学就跟孙猴子一样,我们石头里面蹦出来的,我们石头里面蹦出来的,举手我看一下。所以说都会有一个依赖性,最简单,干嘛先得有你妈才能有你。不。单线程环境,我们现在变成多线程环境的干嘛,什么执行。来交替执行。由于编译器优化重排的存在,多个线程中使用的变量能否保证一致性是无法确定的,结果无法预测。好,这么讲,那么同学们先不要着急,所谓指令重排的意思就是说,假设我们原代码写的是一二三四五六七八九十。底层。为了保证。
05:00
干嘛执行的效果性能更好,它不见得也会按照原代码写的顺序123456去干,尤其是多线程环境。那你说杨哥听不懂,他妈说人话。来海头一句话先给同学们讲,然后我们待会看源码,看代码。大家都参加过高考。高考的时候,你们的备考老师一定跟你们说过一句话,同学们,题目发下来。先把会做的做了,不会做的最后做,那么回答我,你答题的顺序跟你的那个题目卷子上的那个题号顺序不见得是一样,听懂了吗?也就是说,除非你是二愣子傻子了,你说没事儿,哥们儿,我学习好,让他们几道题,然后呢,你花了两个小时就做了第一道选择题,五分,满分。你说没事儿,我哥们儿,我照样考北大清华,那是你牛逼,不过这个时候他妈都是你傻逼,听懂了吧?这道题目卡了半天你出不来,你是不是会到会会做到下一道题目,当然如果下一道题目你再卡,再做下一道题目再卡,恭喜你,你倒霉死了,听懂了吗?
06:07
干嘛,然后你会发现这些高考不行,考的都是我不会的,我会的他不考我没有发挥出来,对吧,最终你差400分上北大对不对。我们接下来过来看。干嘛呢?我们简单一句话。先把会做的做了。不会做到最后做,也就是说你做题的顺序,但出卷子印的人的这个顺序不见得一样。好。当然有哪位高考神仙。比方说数学,你先从最后一道题,大题开始做,注意倒排序,不是到最后倒,倒着做啊,我先从最后一题做,做到第一题。学霸例外,神人例外。那么这个时候请看。干嘛呢?先看这么一个case。XY。
07:01
等等语句1234,那么同学们回答我根据前面我们讲的,因为这个情况啊,同学们一般。上硅谷我们都是要敲代码讲的,但是这个太简单了,老师就不敲了,这么说能跟上。那来in特X等于11 int y等于12 X等于X加五,Y等于X加X乘X1句1234,请问正常顺序我们走下来是不是1234?没问题吧?大多数是这样,但是在多线程环境下面干嘛?可能会出现。理财。指令重排这个源代码写的是语句1234,那么请问有没有可能多线程执行以后把先抢到了Y?这个代码就变成了2134,也就是说int X等于11TY等于12,这是你原代码里面写的,没错。就好比说高考的时候出题的老师啊。
08:00
11题12题,这是他印在卷子上的。但是由于你自己呢,会做12题,不会做第11题。能不能先把会做的12做了再做,不会做的最后再最终攻克?同学们,这种情况存在吧?那么言下之意就是说,你原码写的是X等于11。Y等于12,我想问。底层的编译器执行的时候,X和Y哪一个朝前,哪一个朝后,这两个声明的顺序可不可以重排?没问题吧,所以说他们第二种顺序可以变成什么鬼。2134听懂。接下来同学们请问。我再来。多线程并发了以后。正常源码顺序是1234,请问我现在写,我们后面就读后面的注释了啊,一句一完了以后,我能不能马上去执行X等于X加五。
09:03
同学们认为可不可以?100%完全可以,因为什么?X,我先声明了,后面是不是先声明后使用11加5X等于16,兄弟们完全没任何问题吧?所以说第二种顺序我们可以执行一。三二。四以此类推。听到注意。他要建议过三重,编译器系统重排、内存重排等等,源码写的顺序和最终编译器执行的顺序不见得一样,指令重排存在。我们再来。我想问的是。兄弟们。你们认为?四。有没有可能顺序是4123。那么这个时候。语句四可以重排后变成第一条吗?
10:00
那么这个时候呢?答案是,同学们回答正确不可以,理由如下。能理解了吗?什么概念呢?数据依赖性有这。你这个外,首先你是不是得先申明。第二个,我就算你牛逼。你插队加三,你这个Y先执行,那么X呢。你现在你懂的这个X有两个值,一个是声明初始值是11,第二个是计算以后的值啊,11加五以后是16,这个X是11还是16,你回答我这个事儿是不是就不确定。那么所以说什么东高。WHY?首先你要先声明后使用。第二一个这个X是不是要定值才能计算。更恐怖的,你不能说什么,这个X是11,这个X是五啊。崩溃了,那么这事哥们对吧,那么这个时候。你懂的,所以说语句四由于存在数据的什么性啊。
11:04
依赖性,所以说这个货没办法排到第一个,OK,好。这是。接下来。我们来看看。指令重拍二。这是个什么概念呢?同学们请看。四个印。XY等于零。挺和谐吧?定义了四个变量。线乘一刷,线乘二刷,这个时候线乘1X等于A。等于一。没问题吧?线程二,Y等于B。A等于二,那么言下之意,他要求你正常直行,请问X和Y值是多少?那么同学们请看老师分析。咱们说正常执行啊,就是指令不重排,听懂了吧,不是每一次都会指令重排。
12:04
那么这个时候是带底层编译器优化,那么这个时候请看。In类型的默认值数都是零。我们这先生声明。X等于AA是零,这个X就是零。B等于一,那么现在问你一,线程一执行完了以后,X是多少?那么X是不是就是这个A值,A值就是零这一步能跟上?以此类推。Y等于B。A等于二。Y先用了,BB的默认值也是零,那么这个Y也是零,所以说第一种正常情况。X0 Y0,第一步能不能跟上?好,理解吧。下面由于在多线程环境下面存在着指令重排,大家都会来抢,那么这个时候look。干嘛呢?Abx y等于零这四个变量并没有数据依赖性,同不同意?
13:03
那么他执行就会变成这种情况。正常情况下,X等于AB等于一,但是假设有可能。B。A完全跟上面掉,对对,掉了个个听懂,180度的大转弯。其实B等于一。我先给B赋值了看哈。X。等于A。Y等于BA,那么这个时候将会出现重排后的第二种情况,就会变成X等于A的默认值是零,但由于重排以后先给A赋值了。此时这个A是多少?R斜着过来,X等于AA等于二将会导致一种情况,X等于二,Y等于一。能理解。也就是说,同学们,你们告诉我这种铜牌好不好?
14:03
抬头。注意,我们再说那句题,再说那句话。同学们,高考上考场,先把会做的题做了,不会做的放在后面,最终克服它。你们跟我讲。需不需要控盘这个时候。对吧,所以说什么东西,这它出现什么。哪些情况需要,哪些情况不需要,所以说有better tell来决定这货到底要不要重排,只要加了外叫禁止指令重排,听懂了吗?你必须顺序续做,那么言下之意,你看只要有编译器执行重排以后,那这个X和Y00,这个X和Y21是不是有两套值啊?这就恐怖了,那比方说你们班班长,你们觉得你们班长男的女的,这性别是不是现在固定是男的,如果现在跟你说你们班班长的性别135是男,246是女星天随机,这是不是很恐怖,异形2019啊。
15:02
那么所以说干嘛只能把班长身体上多了一个特殊部件,是不是禁止重排?这个时候让他确认这个数据干嘛,不能乱飞?那么这个时候。OK,那么抬高这个就是我们指定铜排的是吗?第一种情况好,那么。我们呢,接下来。再看同学们。有第二种当干脆。先录一集。
我来说两句