00:00
同学们,接下来给大家介绍第三组引用类型的原子类,我们来看一下。来分别是autom reference autom stamp reference,带流水,带版本号,带戳记流水的原子引用。接下来是第三个,也是非常重要的autom marketable reference在标识标记的原子引用,那么这三个非常重要,而且面试中现在呢也会被问到,首先先来复习,对于我们的原子引用,我们前面强调。在我们API这儿,如果你支持原子整形,那么我希望其他类型也能够纳入到我们的这个包上面,能够结合cns这种思想,用比较并交换成AP,所以说我们这儿给它做了一个适配。大家。道格利在设计的时候干了一个原子引用类型,那么你这个泛型里面可以传各种实体对象,比如说订单啊,用户啊等等,那么这个呢,我们在前面已经介绍过,对吧?那么最经典的我们说过这个自选锁,那么来吧,这儿是不是干过这个事儿,那么只有把这个对象纳入进我们的原子架构里面,才可以用CS这些操作好过,那么第二个。
01:12
我们强调过带流水的戳字,那么这个是什么一个情况呢?那么来同学们主要是什么?携带版本号的应用类型原子内,那么可以解决什么ABA问题,它重要的是解决修改过几次。OK,那么好,一般目前的面试啊,以去年而言,问到这儿就完了,哎,大概他是这么干的,嗯,说一下什么是CS啊,好,那么底层原理是什么啊,C类,嗯,也不错,那么假设CS啊,它呢,有哪些缺点呢?那比如说啊,长期的这个do y啊,容易导致CPU空撞啊,可能有时候消耗大一些,不过这个还不是最要紧的,最要紧的是不是会产生ABA问题,嗯,很好,那ABA问题你准备怎么解决啊?那么你会说我们一般是用带流水戳记的来解决,OK,那么好。
02:02
由于现在呢,这个类里面十八罗汉越来越多的被问到,他马上会问,你那么好,如果我们现在要有A问题,你已经答出来了,用这个,那么请问。对于这个类带标题的这个原子引用了解过吗?那么一下子你去面试就干懵逼了,所以说我们有必要给大家详细的说明一下,这个他们两个几乎是兄弟连好,那么来我们这儿呢,一句话来给他说明白。两个是这样的,带初级流水,那么它呢,用的是版本号,那么。基本上就是调用一次啊,每次啊加个一,它可以解决多次的问题,那么也就是我们这儿所说的解决修改过多少次了,你可能是100,可能是150,可能是200,而这个。它呢跟上面有点类似啊,但是呢,它就是一次。类似于我们的一次性筷子啊,你用没用过类似于我们的。包裹快递你拆没拆过?说穿了带这个标记位的,比如说现在这是一个初始状态,Force没有拆过,只要有任何一个线程动过了,马上修改为触,说明这个东西动过了,它就解决一次性的问题,OK,所以说同学们楼点一言,这个解决修改过多少次,按照是版本号,而这个是原子更新带有标记位的引用类型对象解决是否修改过?
03:27
这个筷子拆没拆过?这个快递你拆没拆过,动没动过?说穿了他就是将这个初季流水按照自增的123456改为初或first,动过还是没动过,干的是一次性的问题。好,那么同学们,我们简单的来看一下这个API,那么理论介绍完了,老规矩实操,那么所以说我们代码说话。构造方法也一样,原子标记位的引用类型,那么哪一个对象,你看这个是什么不尔型对吧?就是出和false,默认呢,当然可以写个for,所以说没动过,只要有一个线程抢过,抢到了,改过了,动过了马上将其会改为true,只要是戳后面的线程就说OK,已经有人动过了,那这个过相当于说这双一次性筷子本人用过了,那么咱们呢,也就别来用了,那么其他的AP啊,又是我们那套原子体系包下面价格那些CS啊,比较并交换等等,好的,那么同学们,咱们呢,代码说话走起,那么在这个类里以后我们现在呢,就是原子marketable reference,那么来。
04:28
搁到这儿。现在呢,我们呢,直接呢写的短一点,就是带标识位的引用啊,那么在这块原子来这个带maable的引用,那么假设啊100,现在呢,它那是force,说明我这个里面的数字啊,这个100没有人动过,好吧,初始状态就是100,那么别的县城来争钱,那么在并发环境下面老规矩,T1你们来吧,和以前的AP那个带戳级流水的差不多啊,来吧,这个呢是有一个东西叫marketable。
05:00
那么相当于说给我得到他目前的修改状态标志位。那么来同学们这个就是什么默认。标识,那么这个时候它的出false情况是什么呀?那么我们应该是false,没人动过对吧?那么假设T进来了,我们现在知道了没人动过,是force OK,我们呢?直接在这儿啊。嗯,停一会儿,那么构建一秒钟,待会我们说为什么要停一秒钟啊,我们完全是为了写这么一个DEMO给大家演示,我们来比较并交换,和以前的一样,都见过多次了。希望是多少,然后改成我们的修改值,然后希望的原有的旧有的状态标志,我们当然是希望是false,没人动过,所以说在这边我动过,把它改成错好,那么现在我期望是100,想改成1000,那么现在我的。7万标识是mark,就是force force就代表以前没人动过,对吧,然后我修改成功,我要把这个标识外从force改为错,相当于说取法同学们,OK,好,这个呢,就是我们的体积。
06:06
那么这个完成T1完成以后,我们呢,过了第二个线程T2也来了,它跟你前面一样,那么相当于啊。大家呢,就应该体会的出来,我这儿为什么要暂停一秒钟,那么说穿了就是等待后面的T2线程和我拿到一样的默认。Flag标识。都是force,就是没人动过,OK,那么好,那么我T2呢也等着你,相当于说T2现在呢也进来拿了,这个呢,一秒钟以后才能修改完成,现在T2进来了,我呢也拿到的是初始值是一般状态是false OK,那么两秒钟以后,那么现在T2呢也想这么改,T2和T1是各自独立的,我不知道有人动过,我只知道我拿的是force,没人动,那么现在两秒钟以后,我也想让它改,我想把它从100改成多少,那么现在假设是2000,那么然后。
07:05
Mark,我也希望是force,因为没人动过嘛,然后我再改成我们的错,代表我修改成功,那么好,现在搞到这儿来看。这个B就是我们T2线程进行CS操作的最后结果,看看它能不能操作成功,那么我们呢,也给大家呢打印一下,那么这个就是什么T2。线程CAS result,它的操作结果是什么样?那么是出还是false?如果是说明T2操作成功,如果是false,说明T2CS操作失败,好,那完了以后更重要的我们呢?来看一下啊,当前我们的。这个对象它真实的。修改标志位是true还是false,以及当前这个对象,它里面获得的最新值是多少,是1000还是两,是1000还是2000?好,那么同学们,我们跑一下来看看程序最终运行的效果。
08:05
请看刚开始T1T2拿到的都是一样,都是初始值100 first没动过呢,但是一秒钟以后这个CS操作成功,我们把它从100改成了1000,标识位从false改为了错,所以说T2运行的时候这个B。CS操作怎么着?First,本次操作失败,因为在我T2修改写回去之前,已经有别的线程T1捷足先登了,这个东西已经动过了,所以说T2来看看现在最新值啊,多少is马不再是默认的什么force了,而已经是错,说明有人改过了,在我之前动过,所以本次操作作废,我的2000写不进去,那么我拿下最新值只能是多少还是1000?哎,所以说深刻体会这句话。ABA问题,用这个STEM超级流水是修改过多少次,反正你改一次加个一,改一次加个1OK,而marketboard解决是否修改过,人家就玩一次性动过还是没动过,如果说默认啊是force,只要是变成to了,那说明什么?人家已经改动过了,OK,好,那么所以说一定要注意这两个的根本区别,那么来同学们,我们的引用类型原子类重要的这三个就给大家呢介绍到这儿。
我来说两句