00:00
好,那么。各位同学开工,咱们呢,开启辛苦学霸模式,那么这十多分钟看老师。啊。Am。Integer和reference这两个case词呢,都给大家呢,彻彻底底呢。讲解一下好。那么这边。我们呢,首先。来看一下我们的这个类。对它呢,进行一个稍微简单的了解。那么呢?干嘛呢?他的意思是这样的哈。对于一个时间戳类的这样的原子引用,它的还代表的含义是一个对象的引用。伴随着一个整形的这么一个时间戳,它们能够被原子的更新那。也就是我刚才在这说的这个版本号O吗?你把版本号和这个时间戳可以理解为。同一个意思。
01:00
好,那么。接下来。我们呢,直接呢来看一下哈,首先刚才我们讲的是不是有一个东西叫。原子引用这个没问题吧,兄弟们。那么看构造方法,那么干嘛让你丢个纸好?那么呢?由于。这个main方法是static的,那么它呢,外面呢,要定义一个static的变量,那么这边。我呢,直接过了。第一个。我们干嘛呢?那么这边。就用这个。看好。那么来,同学们。根据我们刚才的API。这货是不是有个初始值啊?那么好,我们干脆就设成100。注意。
02:00
这个并不是支持时间戳的,这个只是一个普通的原子引用,没问题吧,那么来兄弟们模拟。加这个static是因为没方法是static啊,变静态变静态对静态能跟上好,那么这边请看干嘛呢。你帅。这个是我们的T1线程。那么T1线程干一件什么事呢?Ultimate reference。Compare and set。好,我期望值是100。现在真实值是不是100。我读得了以后,我干完活回来了,这个线程我期望值还是100,如果说这两个100跟100。错,我是不是。反正一个是期望值啊,一个是update修改值,这个已经讲过了,好说吧,这个老师不再多废话,100对100错,我们就可以,什么期望值,真实值,如果比较是一样,我们马上修改值为101,同学们能跟上。
03:06
好的,那么接下来再干一件事。如果是101,我再把它改回来100兄弟们哎。B。哎,听不听得到。能跟上。好,那么这个时候呢。尿thread,这个是我们的TR线程。那么呢?我呢?T2线程。干一件什么事呢?先暂停一秒钟。干嘛呢?因为同学们我们说过这个main线程下来以后。不一定是T先执行,我们讲过了你th.start方法以后不见得。是第线程先执行听懂,那么这个时候我们要确保这么一个事儿。Sleep,那么假设我停一秒,现场暂停。
04:03
一秒钟。TR。线程,那么什么呢?保证上面的T1线程。完成了一次ABA操作,这么说能不能理解我为什么要这停一下,就是让T1线程。干嘛呢?把上面的活干他一遍听懂,那么这个时候同学们请看我们的理由是这样的,内线程只是一切程序的入口。刷刷下来面线程结束了,后面两个线程好。在这块。假设T2先启动,那不好意思啊,干嘛,你一启动是不是就被停了,你一停是不是只剩T1了,那么是不是保证T完成一次,哎。B。哎,这么操作同一方好,那么接下来一秒钟以后,那T2来了。
05:03
那么干嘛呢?奥米克瑞法点compare,假设我100,我要把它改为2019,那么这个时候同学们请看第二。输出,那么。嘉善。这个东东干嘛呢?奥米克,点get,我们看看你的值是多少。年下置业兄弟们,那一秒钟以后T2才执行,是不是T1绝对干了一次ABA了?那么这个时候干嘛,根据第18行我们也会明白,目前这个里面的值啊,是不是就是100,好,那么T1。干嘛?比较的时候,我也是先读到这个里面的。快照值共享变量就是100,我最后来比较诶还是100,所以说我把它改成2019,最后来看看我的改的。这个东东。处false情况,那么大家请看这是不是返回一个布尔值啊?再来看看现在干嘛?这货的最新值是多少?那么同学们请看杨哥的演示。
06:09
一秒钟以后错2019,对于我们这个T2线程来说,是不是修改成功。我只认。开始是100,最后是100,只要比较相等,我就修改为2019。但是抱歉,我们理解的,从实际情况而言,中间是不是有过猫腻的过程啊?好,那么接下来我们来看看。演示了ABA问题,那么接下来就是什么呢?以下是ABA。问题的解决。好,那么在这儿。我呢,把。这样吧。以下是ABA问题的产生。
07:03
现在呢?咱听一下。200兆。那么这这个能理解什么意思吗?就是说这停了两秒钟以后,是不是保证上面的ABA这一段是不是彻底完成了。好,那么接下来。抬高,我们出现这个问题,如果仅靠值比较,大家可以看到ABA问题是不是无法规避,所以说我们现在要引入它。那么这个时候呢,在抵抗这么一个情况,我们干嘛呢?咱们就以数字说话。什么呢?一样。这块,那么reference等于六。Reference,注意,兄弟们。请看。它的参数。要求干嘛?初始化的引用值好说。初始化的stamp时间戳没问题吧,版本号,你就把它当做这个step,就是时间戳版本号,那么来。
08:04
干什么呢?我现在这个值初始化的值是100,时间戳版本号是一。同学们这一步能跟上?好,那么接下来兄弟们请看那么老规矩。两秒钟以后是演示ABA问题的是吗?解决好,那么现在我呢?过来。这也就是我们的T3线程了,听懂那么好干嘛呢?我们一开始T3线程进来。干嘛?先要拿到这个版本号,对不对,兄弟们,那么请看。干嘛呢?这个哥们儿。点塔。Sta塔,然后in塔,我们就来一个stamp塔,那么兄弟们这个是不是诶。Stamp写多了一个,兄弟们,你们懂的,这个是不是初始版本哈?
09:04
说穿了就是T3线程一进来跑到这儿拿到了版本号,解。一好,那么这个时候兄弟们干嘛呢?我们打出来my current。干嘛,相当于说T3的什么东东。第一次版本号。那么兄弟们告诉我,哥们儿,我现在干的这活,这活是不是现在是他就打印出来是一号线一啊。能跟上好,那么接下来。我呢?在这儿。当天。一秒钟。不想写了。干什么呢?展平一秒钟线程,现在是T3。保证。干嘛?我。能够。
10:01
座椅暂停一秒钟,T3,那么言下之意什么概什么概念?就是说我下面又有一个线程叫T4。兄弟们,听不听得到?那么这块什么概念呢?就说我这停暂停一秒钟,T3线程这块是暂停了。比如说三秒钟,我故意的啊,三秒钟多少呢。T4线程就是现在这个,我自己这一步听不听得到。你能下至干嘛?我拿到这个版本号以后,我暂停一下,我等着T4也上来,跟我拿到同一个版本号,换句话说是不是代表T3T4,我们两个的起点是一样的。听不听得到?好,大家请看啊。那么言下之意就说,这块为什么要是三秒钟呢?那么是不是要等?什么鬼,上面的保证,上面的什么T3线程也要完成一次ABA操作。
11:05
这一步听不听得到我这儿等一秒钟是什么呢?我怕我做的太快了。T4现场还没有拿到这个版本哈,那么现在T3说现在我们是不是要演示ABA问题的产生和解决,好,现在就说T3说好兄弟们,我已经拿到了,初始值是100,然后版本号是一的这么一个。那么T4线程说你等着我,我也跟你一样,那么现在是不是T4。这一行打出来就是T4,它的第一次版本号是不是也是一,相当于说两个人的起点是一样的,这一步同学们能跟上。但是为什么我这要比他多停两秒呢?那么这两秒钟是不是足够T3完成一次A操作那么好,我这是版本,耗时我记着了。100初始值版本号是一,你这干嘛,比方说待会儿我们干他几次了以后,我们来比较,我这拿到的版本号是一,然后我再去对比,现在的版本号已经比我这个高了,我这边T4是不是修改失败,这一步能跟上。
12:09
好,兄弟们请看。先杀。我们呢?来了。Reference啊,第二,Compare and set,那么注意,这个时候兄弟们我再来一次啊,可能有些同学没看清参数点。1234请问几个参数,请看希望值。和更新值期望的版本号和最后的什么更新的版本号,那么言下之意,这种情况就是四个值,我期望值是100,如果成立,将它改为101,那么我现在的版本号,那么言下之意。是不是就是我们的这个东东。返本号,如果一切顺利,每次我加个一,同学们能跟上。
13:02
好,那么再来,兄弟们抬弓。这个时候过来就是我们的T3线程的二次版本号,兄弟们能跟上第一次的时间,第二次是几R了?那么也就是说我T3干了他一票,已经从100改为了101,并且版本号已经升级为二,那么接下来呢?那么T3线程一不做,那么二不修,再改回来,也把它从101又改回了多少100,那么这个时候你懂的,现在是不是第三次版本号了。那么言下之意,现在来看这个程序。一。二。三。我版本号永远是往上增的,但是你的值第一次。是100。第二次101,第三次又改回100,回答我现在我们是不是用这个东西做了在T3线程这做了一次A操作。
14:04
那么言下之意,请看。知道我为什么这要停一秒了吧,就是等下面的T4跟我拿到一样的版本号,同学们能跟上好,三秒钟以后。轮到T4了,哥们儿。你行不行呢?T4就过来了,就说我们看你看一二三四一样吧,我们干什么呢?我7万值是100,你可别忘了,妈T3干了三次操作,现在7万值是不是,是不是又被改回100了。那么改回100,如果一切顺利,我希望我的执照是2019。我干嘛呢,那么现在。我呢,期望值呢,我认为傻傻的认为别人没改过,我很乐观,就是这个值啊,然后我也要去改,我要去加个一兄弟们这一步能跟上,那么请看这一步得个啥。布尔类型的返回值啊,那么来。
15:01
那么呢,这是out过来这。接下来兄弟们,我们来了,那么my car。过了T4线程,那么能打印出这个result,那么呢?这个是修改成功否?那么最终我们来看看现在干嘛呢?干脆再来。Reference,那么写在外面T4这块。干嘛呢?Get stamp。回答,我这个是不是我们的最新版本号。能跟上。好,那么这个时候干脆吧,那么我这也不写在外面了。我们来看。那么呢,就是什么呢,当前。
16:01
最新。实际。版本号,那么来,同学们请看。我在这没问题吧。好,那么最终我们来看看假设,再来一个奥点get。干嘛呢,那么呢,这个是什么意思呢?由于第52行已经太长了,不好看,好吧,那么这边老师呢。给他写下来一点。弄过来。再来一次。那么这个线程目前的。什么呢?当前。实际最新值。好,那么什么意思呢?加上。
17:01
这个东东。第二第二套。Preference,好,那么各位同学。写到这儿,大家能不能看到?好,我们请看老师的逻辑和修改,呃,请问一下上面这个ABA简单吧,能跟上了吧。好,下面我们请看。T3。T42个线程。T3首先去干,那么他拿到的东西是不是值是100,版本号现在是一。那么T3准备把它从100改为101,你做了一次操作,我版本号就要往上加一次,做一次我版本号就要往上加一次,同学们没问题吧?那么好,所以说T3。从头执行到尾,那么就是一百一百零一一百这个版本号就是一百一百零一一百,它的版本号就是123,那么现在是不是最新版本号是三了。
18:00
好,那么T4线程呢,首次版本号没错。110。然后呢,三秒钟以后。等着上面的T3是不是已经完成了一次操作。我来开高,三秒钟以后我也想改了,我很天真的认为别人没动过。我要把它从100,我期望值是100,确确实实现在期望值是不是对的。我准备把它投,希望值从100跟我的真实值是100吻合了,想修改成。2019版本号从我原来的一,我T4改一次,是不是想改成二,但是非常抱歉,你的版本号是二,那真实版本号是多少了?三了,那么这个时候干嘛?正常情况下我们将会得到。T4修改成功否?Force当前实际最新版本号多少?三那么当前实际最新值是多少100?那么同学们。通过上面的分析完以后,我们准备开始就运行啊。
19:00
这你看阳哥这有一个小手误哈,刚才我这是不是粘着顺手的话就把这个粘下来了,那么这个粘下来的话,是不是代表这个值永远是恒定的了,那么都是一啊,那么这块不对哈。那么这块我们这儿。手握。粘一下好,那么呢,我们呢,接下来运行一下我们对应的小程序。大家看。以前。全部运行完成好。以前我们对照的,对照着控制台来,最后带着大家复习。A,问题的产生我们都知道。对于这样的方式。A。B。哎,虽然说最后我们的期望值。真实指标一样,我尝试做修改,将它成功改为了2019,但是中间是被有人动过的。那么接下来我们来看。
20:01
刚才我们的进行了详细的分析。我们可以获得。T3T4的第一次版本号。要。要。故意做这么一个案例,就是保证他们两个是不是同时取得的版本号是幺和幺,那么说明什么?他们两个取得的初始值是不是也是100?好,那么接下来干嘛呢?T43秒钟以后再运行,给T3足够的时间完成ABA操作,所以说我们下面用的是step带时间戳的这个版本号的这个,那么就变成什么呢。A。B。诶改了三次,所以说T3线程第一次版本号是一,T3线程第二次修改版本号是二,第三次修改是三,那么最终轮到T4的时候,他呢,很乐天派,很乐观,三秒钟以后以为没有人动过,那么这个时候他就干嘛呢?我期望值是100,希望把它改为2019,我期望值的版本号是一,希望把它版本号改为二,但是理想丰满,现实骨感T4区的时候。
21:09
修改失败,为什么?因为。你T4能提交的版本号一加一等于二,现在服务器上对象上面。最新的实际版本号是多少了?已经三二小于三,说明已经有人抢先一步修改了最新的内容,你现在去做不OK,那么大家请看T4啊,那么想拿拿到一下当前这个对象里面的。真实值是多少呢?100,所以说你的2019根本就没有机会修改成功。好,那么这个就是我们ABA问题给大家进行的讲解和介绍。
我来说两句