00:00
好,各位同学,我们继续那么对于volatile的理解,那么这道面试题我认为呢,我们已经花了整整。接近。三节课给大家详细的介绍了。可见。无缘子。进重排。那么这个V现在是个什么?用在哪?包括单位模式,那么更加要注意GMM再次强调Java虚拟机叫g vm g mm Java内存模型啊,说穿了。就是这张图这段话,那么第一个面试题答不呢?暂告一段落。那么当然外,后面我们讲读写所。来自己手写一个缓存的时候,它还会被用到,那么这个时候包括后面我们看源码,你会发现底层源码大部分加了,我还那句话。你没有用到过,你千万不要说这个东西没用,你的水平和你的层次。可能目前你的格局也就是个增山改茶。
01:00
单线乘法。那么这个时候没用过,你更要去能够用到这些技术的平台和大厂去面试。那么接下来。我们下面。来看看。新的一个题目。CAS。你知道吗?那么来,同学们。不废话。讲一讲奥米克引进的原子整形类。为什么要用CAS而不是C?老规矩。咱们考到了吧。百度cns知道吗?如何实现的?好,能不能老规矩?杨哥呢,便利了各大公司的厂商的题目高频、难点、重点。拎出来。不废话。首先,什么叫cns啊?那么呢?我们在这儿先明确定义。C。S。
02:02
是什么?那么好。来吧。CS首先明确的回答大家就是比较。然后呢?交换。好,这个就是我们的CS,你要说意思已经讲完了。那么这是个什么情况呢?同学们。二话不说。咱们呢?显卡。题目和源码。来。请看。讲一讲这个。那言下之意,这个我们前面是不是说过一次啊,什么概念我们来解决volatile的什么。原子性的时候,那个number加加。我们说过了我们最终的解决方案,大家可以看到我们的什么。
03:02
我们的vla DEMO的时候,同学们。可以看得出。最终我们是不是用这个东西来给大家解决过。没问题吧?那么也就是说当时的时候,我们给大家说过。我们不能加。太重了,杀机不用牛刀,那么我们为了解决这种number加加这种问题,在多线程环境下面的I加加,I减减,这样的能够安全,我们是不是用过这么一个动作?那么这个东东。Get是不是相当于我们先获得在家就是传说中的?爱加加同学们没问题吧,那么这个时候我们上一讲过干嘛彻彻底底给大家。说过这个问题,那。言下之意,还记不记得这段代码了?我们说过,如果我现在来跑一下这个执行,哎哟。
04:03
什么好?在这块有一个刚才呢给同学们讲题的时候,课间给同学讲就给注释了这一段哈,来同学们,我们呢直接转一下,我们说过对于妹方法而言,你看。Number加加。18304是不是写丢了?但是对于第二种奥米克in加的时候,2万能够保证,但是注意。那这两个方法我们可都没有加。如果你能回答到这儿,马上会被项目经理去问,技术经理去考核你懂不懂奥?原子整形。那么好,你会用了23行。我知道多线程环境下面不要用A加加,要用这个就能解决多线程环境下面A加加不安全的问题,那底层原理是什么?CAS,你知不知道什么意思?你说我不知道,我只是会用。OK,你的薪水很难突破一万八两万以上。
05:03
能找到工作可能也就是限于你干个一两年了,撑死也就是一万五一万八,你想突破一万八两万那么底层。你能不能说现在互联网缩招以后,昨天说过了,不是不招,而是招高手。初级的大量过剩。高级资深的严重不够,所以说除非你不吃这碗饭,否则你需要继续提升自己的功力。好,那么接下来同学们,我们来看一下。CAS的比较并交换。什么概念呢?我们就从我们用过的atomic integer。讲起。那么来。奥米克这么一个动作。奥米克等于尿。奥,我们讲过,如果这个里面什么都不写。就是零,那么我们现在为了好区分,我们写个初始值,那么原子类。就是我。那么接下来我要干什么呢?什么叫比较并交换呢?
06:02
那么呢,请看。Integer。16行的这个变量。我干什么呢?第二。Compare and set。也就是说,我们的CAS。就是我们compare and set的英文缩写。那么。C。哎。S比较并交换,那可能同学们会说不懂什么意思呀。别着急。请看这个方法。打开看。几个两餐,我们直接录源码。他说什么?这个印堂。什么意思啊,7万只。这个是什么东东呢?庚辛指它的意思是这样的。这个线程,那么呢,我们前面讲过了。现在多线程环境下面,是不是牵扯到多个线程去操作主物理内存里面的这个变量。
07:07
改回来,先变量副本拷贝弄过来,然后本地改完了是不是要写回去,是不是经常会发现线程血丢失,血值覆盖这样的问题啊?那么这个时候他干什么呢?抬头请同学们看一下。现在正是老师的讲座。讲桌。现在这个讲座全班是不是只有一份,你们有很多个座位,很多个同学。但是目前。讲台是不是只有尤且仅有一个,就是杨哥?请大家看现在杨哥。有这么个情况,我希望这个讲台上,我们现在这个讲台有且有仅有一份,就是我们的主物理内存。那么同学们请看现在我们的初始值,假设是这瓶矿泉水能跟上,就在讲台上。好,那么这几位同学,假设前排的这三位同学,你们刷。
08:05
拷贝回自己的本地工作变量里面哈,三个县城,你们是不是都这群矿泉水?那么眼下支线。你现在。好。请大家看。刘欢同学。可能需要把自己的劳动成果。他从矿泉水已经修改回了。鼠标,那么这个时候它到第三步。游欢同学,这个线程需要把这瓶矿泉水。干嘛呢?改为鼠标,那么这个时候他是不是要把他自己的劳动成果写回到主物理内存,写回到我这个讲台这。从水变成鼠标能跟上,但是不好意思。油花。现在碰到的问题是,他期不期望?有人在他之前动过改过,他肯定是不期望。
09:01
那么这个时候什么概念?如果有人动过,改过说明什么?他需要把。现在最新的值啊。再读一遍,再重新操作一遍,才能写回来。能理解,那么所以说请看这块的参数。一个叫期望值啊,一个叫更新值啊,什么意思呢,好,现在。妹线程进来。我读到的值。是五,初始值是不是五我就拿走了,也就是说我从主物理内存。得到的值是我拷贝到。Main线程里面的工作内存里面还是我main线程,巴拉巴拉去干了一段事,我希望把主物理内存的值从五改为2019,那么请看它是这样的。我就最好希望。现在。这个的值没有被其他线程动过。我期望值啊。
10:00
没人动过。什么都没改过,就只有我一个人来想要我干嘛呢?如果我拿的值初始值是五。回来以后我会拿我手上的这个快照这个值跟主物理内存的这个值去对比,我自己期望也是我为什么如果我拿的时候是五,比方说三秒钟前我拿的是五,三秒钟以后我的劳动成果要写回主物理内存,我希望主物理内存里面的尺寸不要有人动过。那么这个时候说明是不是。就像是什么没人跟我抢啊,那么这个时候请看。我。哪个支持我?杀着回来,我期望值是五,如果这个期望值啊,跟我手上的这个值是一样的。回答,我说明这个指是不是没人动过,那么这个时候请看。我就将它修改为2019。然后干嘛?请看比较并交换这个值是什么类型。布尔型,那么请看第2SO。
11:04
那么这个时候什么概念呢?处,然后加上那么目前。当前值是多少啊,那么这是我们的,哎。M integer这个整形变量第二。Get,好,同学们请看啊。这个。就是什么。主物理内存的值默认是五,现在有一个线程,没线程进来。他在这儿内度。Since。干了点活。三秒钟以后,假设他要回来。我最希望是不是我这个里面的值,主力内存的值没有人动过。如果。我的值啊。第一次快照拿走的值是我现在物理内存的值也还是我,说明什么?
12:00
期望值一样,这个时候我就把我的这个主物理内存的值啊,由五改为2019,这个2019就是内线成的劳动成果听懂。好,同学们请看,我已执行。修改有没有成功?错成功,当前值已经变成多少?2019。这一步能跟上。那好,各位同学假设啊。我们这儿又来了一个线程。我期望值是五,我第二次执行哈,如果还是五的话,我希望我把这个值改成1024。那么来看看这个我能不能修改成功,并且。现在这个值是多少?那么同学们思考一下。第一行,第21行,我们的值。修改动作错。说明什么?我拿走的只是我现在昧县禅去干了活,在自己里面干。
13:04
内存里面的东西没有人改,回来的时候一对比。比较并交换。拿的时候是五,回来的时候期望值我还是别人不要希望,希望别人不要动过,还是五,五等于五,这个时候能不能修改,能,所以说修改操作错,当前的值照2019同学们。能不能听懂?那么下面我们的问题是。第23行这段代码,同学们思考一下。打出来的。错还是first,以及现在get这个数字是五还是2019还是1024,请同学们思考一下,你们说。好,有同学说这是负,那么请问这个值是多少?2019好,那么是不是像同学们回答是这样呢?我点。请看。
14:00
能理解什么叫比较并交换了吧。好。现在干嘛呢?我们呢,最简单的再给同学们。画一个图,说一下永远明白。现在在这块主物理内存,它的值现在是五,没问题吧,那么现在呢,来了两大线程假设。我们讲过前面的GMM内存模型要有原子性、可见性和什么有序性好,现在开始从主物理内存那么第一步。五零内存。现在那么也就是我们这。度以下没问题吧,那么沿下支线。干嘛呢,哥们儿?你自己干的这活儿。我们懂的。
15:01
当我们有了一个实例对象。在堆里面,堆就是在内存里面,那么现在这个初始值是不是就是五啊,这是第一步,同学们没问题吧,第二步干嘛呢?PE。T22个线程前面根据GM内存模型讲过了。干嘛分别各自从主物理内存拷回进各自的什么工作内存没问题吧?那么就是。T1现成的工作内存,也就是什么变量的副本拷贝。兄弟们,没问题吧,这这段话。好,那么接下来。那么,当然。这个呢?就是我们的什么T2的。工作。内存。那么这个时候,他们两个各自完成了。
16:01
那么现在假设T1这个线程,我自己的工作内存,我已经把这个值改为2019了。那么第三步我是不是要写回?主物理内存。那么言下之意,我现在要干嘛呢?血回。主无力。内存并通知。其他线程可见哈。假设我们现在呢?要这么干?好。当然,可见性,我们要加BY没问题吧,那么好,现在我们也没有加better tell。因为外是上一节,我们现在主要介绍CS,那么我们最顺利的情况是不是希望T1拿走的时候是五。回来的时候,这个主物理内存还是我还是我,说明什么,是不是没人动过?好,那么这个时候假设。T1拿回去的有一个值啊。
17:01
是我。然后现在跟内存比较,还是我,我的期望值还是我就是我的。快照这个值。和我的期望值是一样,那么说明我可以修改为错,我将会把这个2019写回给主物力内存,这就是比较比交换我拿的值,希望值跟真实值如果是一样的,我可以把它改成update修改值,OK。那么同理,如果T2回来,我拿了执照快照,这个执照是五,那么回来以后我也希望是我希望别人没动过,但是抱歉。那这个值已经变成了多少?2019了,那么我的期望值和主物理内存的真实值啊,已经不一样了,那么这个时候本次修改失败就是我们这儿获得的first,那么这个时候我就要看看,那现在主播内存值到底真实值是多少呢?多少了?2019是不是被前一个线程已经捷足先登改过了呀?
18:03
那么这个时候同学们有点像什么?是不是有点像我们的HUBSVN的提交版本号啊?你们一定干过。是不是提交的时候有版本冲突啊,其实这个版本冲突啊,就有点这个什么比较比较换。OK,好,那么呢?所谓的CS的比较并交换,就是我们一句话。总结。那么干嘛呢?我。如果现成的期望值跟物理内存的真实值啊一样,我就修改我我的。更新值。本次操作错,那么呢?修改,如果期望值和真实值不一样是false,本次修改失败。这个时候干嘛?我们需要重新获得主物理内存的真实值,OK,所以说CS就是比较比交换的意思,同学们这个概念能跟上,OK,好,能不能这个先给大家介绍到这儿。
我来说两句