00:01
那各位同学。我们继续。那上一讲我们给大家介绍了cns的。主要的一些缺点,因为任何技术没有没有完美的。那么这个时候就会引出来一个ABA问题。那么接下来。一整套。这些也是大厂高频的问。因为现在这个类啊。用的非常多。所以说只要你用过这个类,他就会问你UN save啊,CS啊,底层。汇编,圆语等等,包括它的缺点,那么这个时候只要你这一个。问了CS,他马上会问你CS的缺点,那么CS的缺点其实最重要的就是ABA问题,那么如果你ABA问题你能回答的出来。那么这个时候干嘛?他就会问你,谈谈原子更新引用。你知不知道?那么接下来呢,不要着急啊,我们首先。CAS。由于它的缺点。那么引出了一些什么鬼呢?
01:01
啊,这些东东。我们会明白是不是大家。UN safe类也简单的。了解了一下,那么按C类了解了以后,主要是底层是CS的是吗?底层思想。那么这些出来以后,他就会问你CS的缺点,那将会有一个ABA问题。那么好,ABA问题,那么接下来我给他讲清楚这个问题,如果你知道,那么他也会问你什么呢?原子引用更新。好,如果原子引用更新你也清楚了,那么他马上又连锁连锁的来问你干嘛呢?你如何?规避ABA问题。差不多。这条。123456,基本上就是什么说狠一点。
02:00
你要把这道题目。全部整明白还是不容易。那言下之意。你可以非常非常确定的。干嘛呢?从这一个类里面。扯出来下面一堆的问题。CS这个这个兄弟们我们讲完了吧。接下来聊聊ABA问题。那么这个时候。老师,杨哥能不能用一句话告诉我什么叫ABA问题,听好。很简单,不难。狸猫换。太子。讲完了。这时候呢,我都理解,兄弟们呢,是不是又想准备点我要让我讲人话了?但是你,你也知道我的风格,一句话讲明白。那比方说很多口诀是吧,线程操纵资源类。
03:03
等等等等。包括。拉姆达表达式的拷贝,小括号斜词右箭头落地大括号,兄弟们都知道我的风格,一句话。那么接下来什么意思呢?在之前哈,我们呢,就是这么一个判断。那假设哈,我们还是画图让大家舒服一点。这个是主物理内存。好。现在。不好意思啊。两个。AB2线程来操作how。按照我们以前的。说法。假设初始值。他呢?是一个。五。两个线程各自拷贝回各自的内存空间。都是五同学们第一步很熟悉了,应该能理解了吧。
04:01
GMM的内存模型。那么接下来如果一切顺利,他是这样的。如果A线程。先回来了。这个内存地址的。偏移量的值还是五,五和五相等,那么这个时候假设我自己的工作,我已经把它从五。改成六了,那么这是五,这是五,那么最终同学们你们懂的。这块的纸咱们是不是直接让。A线程协会成六对吧。好,这是前面讲的,挺和谐的。但出现了ABA问题是什么情况呢?这个时候。坑爹啦。还是他。假设。我们现在干嘛呢,也是两个线程。不好意思。这个线程。TE。
05:00
TR。刚好就他们两个。但是这个线程的工作他要做十秒钟。这个线程每次两秒钟。就能完成。也就2:1快。这么说,能跟上。所谓的ABA问题什么呢?假设。现在。初始值是A。第一轮他们两个是不是都会拿过去A作为自己的工作空间,没问题吧?但是。两秒钟以后,由于二号线程比较快。他已经。啊,这个A。假设。改为了B。这是T2杠的,因为两秒钟以后没有人动过T2回来,原值是A,希望值是A,这个时候修改成功T2线程。将A改为了B,这一步能跟上。
06:00
好。挺好的,那么这个时候干什么呢?二号线船。现在。他是不是已经把他工作空间里面的这个B。写回了主物理内存没问题吧?但是。二号线城呢?现在又干了一件事。来了。因为我比。一号线要快。我呢?又把现在主物理内存的值从B。又改回成了A。这么说能不能理解?那么沿下支线有点类似于。我呢?改完一次以后,我又折腾把我自己的。工作空间的值又从B改回了A。然后再写回主部的内存,听懂了吧?中间有一个时间差,明白好二号线程干嘛。
07:03
走人了。但是一号线程十秒钟以后回来了。我期望值是A。真实值也是A啊,一号线程就认为太好了,没有人动过,那么这个时候干嘛呢?一号线程将会把它的值。写回主物理内存,假设这个时候他呢,就把这个值改成了25。兄弟们,表面上看是不是挺和谐?但是中间这个T2它有猫腻。他改过一次了,又把它改回来,这个时候在T看来,如果还是用CS的比较。开始是A。结果是A,中间这段过程不但改一次,我们可以看看T2是两秒,T1是十秒,他们两个是不是五倍的时间差距,它可以改abbb BA同不同意?
08:01
那么所以说这个时候请大家看,请看老师的讲座。现在。干嘛呢?此时,主物理内存是这瓶矿泉水。两个线程,杨哥和刘欢两位同学拿的快照拷,从主屋的内存拷贝到各自的工作线程,都是这瓶矿泉水好,杨哥需要十秒钟。游欢同学,只需要两秒钟。那么这个时候请看。油花。他干的事儿呢?两秒钟以后,没有人跟游欢抢。只有两个线程油花。是矿泉水,主物理内存也是矿泉水,那么这个时候是不是真实值和期望值是一样?这个时候游欢将会把他的劳动成果。写回主物理内存,这个时候讲桌上这瓶矿泉水将会被油花A线成替换为口香糖,这一步能跟上,也即现在主物理内存被游欢这个线程动过了,听懂了吗?
09:04
但是又过了一会儿。油欢呢。又把它从口香糖。又改回了矿泉水。这个时候干嘛?对于别人而言。并不知道刘欢有这个猫腻。十秒钟以后,杨哥回来了,我也有我的劳动成果,我准备写回主物理内存,并通知其他内存可见。但是这个时候请看。我出现的问题是?我期望值是矿泉水,实际情况也是矿泉水,我就认为别人没动过,这个时候我再把干嘛这个。电源插座。写回到我的。主物理内存,但是抱歉,虽然说我期望值是矿泉水,我手上的值也是矿泉水,我们的期望值和真实值一样,但是中间可能被另外的线程。改过很多次了,那么也就说什么。
10:02
首尾是一样的。但是中间已经有很多次猫腻的机会,这个就叫ABA问题,同学们能理解。那么这个时候,我们不凡。再来看看。它怎么产生的?Cns的最大的一个缺点,必须要答A问题。不打。人家就知道你妈只会用,你根本不懂原理。CS算法实现一个重要前提是取出内存中某时刻的数据,并在当下时刻比较并替换。这个时间差。会导致数据有变化。比如说一个线程。从内存位置取出A,这个时候to也从内存中取出A,并且to进行了一些操作,将值变为B了,然后to线程又加,这个位置的值变成了A,是不是从A改为B又改回A?
11:01
也就是说。其实而言,这个内存。位置V当中这个值是变化过的,同不同意?那么这个时候one线程进行CS,发现内存中还是A。他会傻傻的以为没有人动过。那么然后。A比较操作乘高。但是,尽管线程one的CS操作是成功的,但这个是不代表这个过程就是没问题,因为这个过程有猫腻。能跟上OK,好,所以说这个就是我们的ABA问题。
我来说两句