00:00
各位同学大家好,接下来针对外给大家做一下最后的小总结,呃,通过前面的学习,我相信大家对外tell应该是有一定的认识和了解了,但是呢,害怕大家在面试过程当中。没有办法很好的组织语言,说不出重点,所以说杨哥这儿考虑到大家要去大厂面试,哎,大家都清楚,现在或多或少有点卷,那么也给大家准备好了一些最后的中章陈述,换句话说就是给大家准备好了八股小作文,那么请各位同学该记记,该背背,看一下这章会考些什么。来,首先v tell,就一句话谈谈你对V的理解,那么它的特性。可见没有原子近重排,说白了只有可见性和近重排,那么聊聊它的可见性是如何保证的?是什么意思?什么叫可见?好,那么同学们。对一个变关键字修饰的变量,假设是写,也就是对这个变量进行写操作的话,写完了以后,这个变量的最新值啊会立即刷新回主内存当中,相当于说写完就立刻卡米特提交。
01:10
那么这样的话,保证我们主内存里面的这个值永远是最新版本,好第二个。读操作,那么其他线程也需要去主物理内存当中去读,那么一旦去读就要保证总是能够读取到这个变量的什么最新值,也就是保证写后读大家都是最新的,那么这个也就是说可以获得这个变量最后也是最近最上一次被修改的值,当某个线程收到通知以后去读取V修饰的变量值的时候,那么之前。你线程私有工作空间也是工作内存当中的数据就会失效,以及不好意思啊,你现在手头上这一份已经不是最新的了,烦请你重新回到主内存当中去读取最新的值,OK,那么所以说这个呢,就是保证了它的可见性。那么之前。
02:04
我们大家在讲这个案例的时候说过,这个就是个v flag默认是个错,对吧,T1这个线程如果是处的话。不停的去在这循环转着,但凡有may这个主线程,有其他线程,把这个flag变量从默认的处修改为false以后,T线程马上就会获得,那么这个时候立刻结束循环,打出这句话,但如果它不是来的,那对不起,没有人通知我,就算别的线程修改了这个flag变量的值,没有人通知我,对我不可见我依旧在会在这这呢打转,我也要这个循环不会跳出好,那么。不保证原子性,这个说过了不再展开,那么所谓的进程盘,那么是什么意思呢?主要就是那些内存屏障对吧,漏漏死多死多,那么主要。斜直令和读指令,那么通过前面那么也给大家呢说明。对于Y写在前面会加一个store store屏站对Y写。
03:01
在后面会加一个store漏的屏障,那么它就保证了对于store store禁止上面的普通写和下面的外写操作重排序都有都漏,那么禁止上面的V写和下面的外读写或者普通写操重排序卡在这两边位置固定,非得按照我们的顺序,那么这个就是我们的letter,这写操作OK,详细的笔记都给大家全部整理好了,我就不在照本宣科的读,节约大家时间好。那么对于读指令我们都晓得它呢,前面没有一定要注意区分,为了要读,全加在后面。那么这个呢,是load load和load store,对于load load屏障,那么禁止下面的普通读V读和上面的V读重排序,那么对于漏多屏障,静止上面的V读和下面的V写或者普通写重排序,哎,它就是靠这个来保证。那么接下来我们来进一来看一下,凭什么我们Java写了一个关键字啊,你在Java源码级别是很简单哈,可能就写了这么一个关键字啊,那么系统的底层怎么会就会加入这个内存屏障,那么你们这两者的关系是怎么勾搭上的呢?我们来来看一下我们的字节码层面。
04:16
来,同学们先看理论。如果某个。变量,比如说这个啊,Flag,这个布尔型的flag,它被V修饰了,我们通过字节码命令翻译成机器码以后,会发现它在这会有一个flagx标签ACC_v ta,也即。只要我们在源码层面加了这么一个关键字啊,底层的话会添加这么一个标识。Java虚拟机就会把自节码生成机器码的时候,发现操作的是一个变量的话,会按照GMM的规范在相应的位置插入内存屏障,哎,所以说主要是我们在这儿写了个。维来关键字底层会给我们翻译成它Java虚拟机一读到这个关键字就明白了,这是个来变量,按规矩走,以流程来加入屏站,那么所以说同学们我们可以简单的来演示一下。假设这个类题一。
05:13
杨哥呢,在这定义了这么一个动洞,OK,最简单的一个外条的变量,那么呢,回到我们的底层的。Java p-C,那么假设啊,我们这T一点。Class。OK,那么来,同学们。我们呢,就可以再找一下我们这个变量来,大家请看这个是个布尔型flag,大家请看是不是有ACC,为了他有这样的关键字啊,有它了以后就跟我们底层的内存屏障就可以加固,这两者是通过它来进行了关联和绑定。好那么话又说回来,可能会被问到什么叫内存屏障,有哪一些能干一些什么?那么来同学们,所谓内存屏障。是指一种屏障指令,它使得CPU或者编译器对屏障指令的前和后所发出的内存操作注意执行一个排序的什么约束,对吧?什么时候在前,什么时候在后,什么时候全在后,所以说有这样的约束就会产生内存栅栏,或者叫栅栏指令,由它来禁止。
06:20
指令重排,从而得到了我们程序的一种最佳的指令顺序,那么内存屏障能干什么呢?主要就是阻止屏障两边的指令重排序,我们前面说过了,对吧,前后。来全是号对吧,所以说。写数据加屏障的时候,强制将线程私有的工作内存数据刷回到主理内存,读的时候,你线程私有工作内存的数据就会失效,重请重新回到主物理内存当中,获取最新版本的数据,OK,所以说它就是阻止屏障两边的指令重排序。不让你自作聪明听陈学的安排,语义要保证只有一种意思,好,那么内存屏障的四大指令,那么这个呢,我们呢也给大家呢详细说过,写操作假如是什么,读操作假如是什么,就不再赘述和啰嗦了,最终三句话给大家总结,那么面试的时候可以给面试官说一下。
07:20
来也记,完tell写之前的操作都禁止重排序,到完了之后,第二完tell读之后的操作都禁止重排序,到完之前,如果前面是完写,后面是图是外读,禁止重排序,OK,所以说。最终如果比面试,那么这三句话说出去应该是一个比较靠谱的答案。好,那么同学们来tell就给答案详细的介绍到这。
我来说两句