00:00
好,那么同学们,我们继续。那么再强调一次啊。API这个问题呢,刚才呢,课间呢,也有同学来咨询了一下。首先啊,ABA问题呢,干嘛呢,它呢,就比方说。它是。只管什么开头。和尾巴。以前的CS啊,只要你逃是A,最后我过来,我来找你的时候还是A。我就认为你没动过,然后呢,比较并交换成功。我没有管中间。但是我们就有点类似于哈。中间这个过程,在这一段时间差,有可能你这个内存位置的东西是被人动过的。那么呢,如果你不介意,就是产生了那个A问题,无所谓,我只关心头尾对得上就OK了,那么这种东西就是发生了,你也无所谓。比方说我现在。
01:07
某位同学找我借了钱,100块钱,一周以后你还我。周一你找我借了100。星期天,你还我一把,咱们两个。淡就清了,我不关心你。中间这个过程,你这100块钱你是拿去炒股票了,还是拿去借给别人了,或者你是到时候还我钱。你是借的高利贷,还是借的p two p还是借的蚂蚁花呗,借呗不重要,我关心的就是只要你对得上就OK了,但是这个呢,就是只管结果不管过程,但是这个过程中间可能有人是动过的,我们就要看中间这个过程,如果你不介意别人动过。那无所谓了,根据你的业务诉求,但是如果我们要求是什么,对不起。不要以为你头跟尾对得上。A。
02:01
中间有这个B我不介意,那么另外一种业务诉求就是不好意思啊,只要我改的时候。干嘛不要中间产生猫腻,那么这种情况将要出现,我们今天接着要讲的另外的一个干嘛。原子饮料及相应的原子饮用时间出问题。那么接下来不要着急,同学们跟着我来。现在我们已经明白了ABA问题是个什么。总之,就这句话,尽管一号线程的CS操作是成功的。但并不代表这个过程没有问题,刚才我们讲过,这个过程是不是可以被逼现成狸猫换太子啊?我先把太子换成立邦。打了太子一顿。然后呢,再把狸猫换回太子,中间这个太子是受过伤害的,好,那么如何解?那第二个问题就是如何。解决ABA问题呢?仅靠以前的CS啊,不够了。
03:02
你咋整的?好,同学们,那么接下来我们先来看一个东东。俗称原子饮料。好兄弟们。什么叫原子引用呢?Atomic RI法。那么大家告诉我,这个奥米inte是不是原子类的等形?那么在高并发的情况下,我们都知道我们需要保证数据的一致性,也就是说我操作的时候最好这个操作不要有中断和破坏,同不同意兄弟们?那么这个时候呢,就会出现一个问题,就是。Do you see。给我造了原子整形,可比方说我还有别的整形,别的类型啊,柚子啊。我。等等等等。假设我希望是一个原子用户类型,原子订单类,原子客户类,原子student类,那行不行呢?
04:05
那么这个时候。完全可以。也就是说,如果你觉得接力K。给你提供的默认不够,那么呢,你可以自己造。接下来。兄弟们。请看。这块。我们这边边是不是有这个整形布尔形等等,别忘了。我们这还有个奥reference,那是不是叫原子引用啊。那么言下之意,这个value。就是你需要进行原子包装的放禽类。你丢个user进去就是原子user,你丢个customer进去就是原子客户,同学们能跟上。好,下面请看老师演示一个最简单的case。节约时间。User。这段代码我不说了,能不能整明白?
05:00
好吧,节约时间,重要代码老师单弹敲这这样的代码。我相信你们肯定不会怀疑杨哥,杨哥肯定是能编的,没问题吧,那么这块呢,过了。Out reference,你引用谁呀?我引用这个user,同学们,那么这个user是不是就是这货?好,那么干嘛?来尿。法么?稍等哈,这个输入法有点。微软的这个输入法好。来,兄弟们,我这是不是相当于说给他做了个原子引用包装呢?好,那么来吧,干嘛呢?User第一个用户叫张三尿。OK。来名字叫张三,名字22,那么再来一个用户,兄弟们,李四名字叫。你说。年龄。25,兄弟们没有任何问题吧,那么假如说哈,我们尽量的跟这个业务无关吧,一进来就有两个用户,那么这两个用户是不是在跟要把它封装成原子引用啊,那么怎么用呢?
06:11
哥们儿,你现在两个用户那主物理内存里面。现在的主物理内存是不是就是应有奥reference了?那应该是谁呢?兄弟们。Set一个user user进去谁张三?那么言下之意,这是不是张三好跟刚才的。原子整形一样,现在我们是原子user类型。请看。我设置在这个里面,现在是张三,按照GMM的内存模型,现在主物理内存的共享变量是不是就是这个对象张三。没问题吧,兄弟们,你们过来,你们干嘛呢?假设。Compare and set,如果我期望值是张三。我需要比较并交换成功了,我将把它更新成为李四,这一步兄弟们能不能跟上?
07:05
好,那么大家请看此时它干嘛?返回是一个布尔值,那么布尔值完了以后我想。看看兄弟,你最终干嘛呢?得到的是个什么鬼?那么get,好。点to string,那么来,兄弟们请看我初始的时候是不是张三。然后比较并交换。回来以后,我希望。没人动过,那么这个时候干嘛?假设希望值和真实值都是张三,我就把这个改成李四,如果修改成高,那么这一段是不是应该这个布尔值反馈给我的错?那么这一段代码是不是应该给我打出李四?年龄25岁,兄弟们能跟上?那么此时请大家搂一眼看吗?是不是错?当前已经从张三变更为李四,他现在是25岁,好吧,好,那么再来一个。
08:08
我再执行一次啊,兄弟们。你们觉得这个结果是什么?首先,兄弟们大胆说,你们觉得这一行是什么呢?是true还是false?正确,那么这一行的结果是多少呢?回答正确,很简单。现在的值经过第32行代码以后是不是正确?物理主物理内存里面的值是李四了,你现在想改回张三,抱歉。那么这个时候不多废话。Force修改失败,那么这个干嘛?就已经变成李四,因为你必须是说白了是不是这个值,除非是李四你才能修改啊。啊,那么言下之意,同学们,这个就是我们的什么奥?Reference原子引用,如果你想对某个类进行原子包装,那么可以参考这个类的写法。
09:04
不开好,有原始饮料。我们呢,干嘛呢来解决ABA问题?主要是要什么呢?理解原子引用没问题吧,那么接下来。我们呢,再来看。下面的好。那么首先,干脆原子饮料先给大家录一集吧。
我来说两句