00:00
好,那么同学们接下来我们来看一下,呃,第一个,那么它呢会导致CPU消耗多一些,这个呢还不是最主要,那么最麻烦的呢,就是我们的ABA问题。那么下面我们也知道了,ABC问题呢,它主要呢,就是看内容对吧,反正一开始是A,中间我不管,回来以后还是A。那不好意思啊,我就认为你是OK的,可是中间这个过程我把它忽略了,那么同学们想一想,我们如何规避这样的风险呢?那么这个时候答案就是需要添加我们一个非常重要的概念,那么就是。版本号。那么也叫。戳记流水OK,那么回到我们的API,我们之前讲了那么多。常见常用的是用reference。而这个还不够,因为他一般就是只看内容,我们现在呢,需要新学一个东西,叫Tom stamp reference,这个就叫邮戳,就是我们邮电局盖章的那个邮戳代表就是我们这儿的。
01:02
版本号或戳具流水,这什么意思呢?比如说哥们儿。你第一次取的时候,以前我们只看内容,内容是A没问题,你把它改回来是你中间呢。改了一个B,你又把它改回来是A。我只看内容,之前是A,现在也是A,好像感觉没什么变化,而这样的话,中间这个B就被你略过去了,现在我这么干。内容。仅仅检查内容是不够的,我们加上版本号,你刚刚取的时候这是个一,现在有人提交是B了,那不好意思啊,只要提交过一次啊,我们就往上加个,就跟我们的MYSQL自增ID一样,现在这个版本号只要人提交过,那么我们就往上加个一是二,好,那么你拿走的时候版本耗时间,回来以后突然发现你想提交的话,你认为你才是版本二。但是现在发现服务器上已经是二,服务器上已经比你手上的这个一更加的辛辣,说明在你之前有人动过了,那么此时你再决定你后续的业务逻辑是放弃还是重做好,那么接下来如果你呢?
02:10
再自选,那在B的基础上再去做,再提交一次,那么这个呢,就是3OK,所以说每提交一次啊,来增加一个版本号,用版本号来决定我们的。ABA这个问题是否可以解决,那么接下来我们就来看看我们一个新的类auto stamp reference,带有流水版本号邮戳的这么一个引用类,好,那么同学们简单的呢,来看一下其实这些API啊,那么构造方法呀,那么来。看一下构造方法就一个,大家请看初始化的引用,就是value,这是个对象值,初始化的版本号,流水号,那么假设一开始就是一,那么接下来那么这些呢,也就是什么?你看比较并交换,也就是奥米。这个原子类体系的这一套,好,那API的调用我们简单的说一下,然后我们给大家写一个。
03:03
ABADEMO来告诉大家如何彻底解决ABA问题。那么来我们先看简单的case API调用。首先节约时间,我们先写了一个book,就是个ID,就是个book name,我们现在呢,来看看对于我们的这个类该如何使用。另一个book引用Java book等于new book。那么作为我们待会。实现投放进去的对象,相当于这个里面的放行,就是刚才我们的book,由它来作为我们戳级引用的对象,前面已经强调过。如果按照原来你只检查内容,开始是A,后面也是A,你觉得这笔账就对上了,那么现在更复杂更细腻度化的控制,发现这个是不可以的,我们要添加一个版本号,添加戳级流水,所以回到这个的构造方法,它呢没有空仓构造,必须要带着V和初始化的对象和初始化的流水号。所以呢,我们这。
04:02
直接过来,那么本次案例呢,我们呢,也就是给大家演示奥Tom stamp reference它的。常见API的调用方法,那么这是我们带有初级流水的引用。过了,那么在这呢,不废话,首先这个呢就是Java不可,那么假设它的流水号就是一版本号,OK吧,这是我们的初始化的条件,那么接下来来熟悉一下它呢,第一个get这个呢就代表引用。OK,那么相当于说你给我得到这个里面的值是多少,那么就应该是我们的Java book,那么第二个呢,大家请看,再来看这个叫什么get STEM,这个呢,就是得到我们的当前的流水号,那么此时我们1RUN先来熟悉一下这些常见常用的API,可以看得出目前这个就是book name是叫Java,版本号是一,它就相当于我们这的A1 OK吧,好,那么同学们,我们继续。那么接下来呢?
05:00
我们呢,产生的第二本书啊,第二本书呢,就是我们的B假设叫MYQ。来,这个呢是我们的MYSQL,这是二号好了,那么现在呢,我们已经取得了一号,下面呢就来。我们的二号MYSQ一样的如法炮制,那么来吧。相关的调用大家请看,把book可套进我们这个里面,才能获得奥米原子类一系列的这样的CS这样的API调用方法,大家请看我期望值的是什么,如果是一致,我们改为新的引用,然后期望的上一个版本的版本号是多少,如果期望值OK,那么这个时候我们换成新的版本号,所以呢,在这儿。我们呢,希望值呢,当然是希望呢,别人没动过,那么所以说我们在这。就是我们的Java book,那么现在我们要把它换成B,就是我们的MySQL book,那我们的版本号,那么自然而然就是希望原有的版本号,然后呢,在原有版本号上面加个一,好同学们这块应该没有任何问题,能跟上吧,好,那么再来它呢,是有返回值的。
06:15
好,那么这个返回值。那么弟兄们,也就是我们的。这个B。OK,好,那么此时啊,我们呢,来看一下把这个B。也打出来。那么来同学们现在是由A,它的版本号是一,那么我们现在只有一个人对吧?只有一个main线程,我第二次来干的时候,我希望是Java,没人跟我抢,我要把它换成MYSQL版本号我希望是一,现在呢换成二,来同学们lo此时来看看这个操作,这个布尔值O不OK,大家请看原有的这个相当于是一号是Java,现在是不是换成第二个版本是MYSQ了。OK,好,那么我们继续,我们偷偷的又把它换回来。
07:05
再来一组,那么我们期望值呢,是MYSQL,我又把它换成了Java book啊,那么再来一组,来看看我们的效果,那么同学们。走起,这是一个它经典的使用来同学们。我们呢,可以抓一张图来给同学们呢进行一下说明。搁到这儿,我们大家呢,会。一目了然,第一个,那么同学们都清楚啊。一开始啊。你是Java,然后现在你又发现还是Java,那么是不是代表中间没有人动过,不是这样的,大家请看中间是不是会被改成了买CQ了,如果你只检查两头的话,那么这个时候中间会有人给你做药的,所以只检查内容是不可以的,我们必须要检查版本号。123每动一次就要加个一,那么这样如果版本号不一致了,我们才晓得中间已经被有人动过了,OK,好,那么这个呢,就是我们对。
08:07
Reference带有级流水的这样一个API的简单介绍,入门级别的案例,下来我们来复杂的这个只是单线程版本的,那么在多线程下面呢,我们如何A避免APA这种问题呢?下面我们继续。
我来说两句