00:00
同学们,咬牙坚持,再坚持一下,胜利往往在最后坚持一下的努力当中。我知道这块让大家第一次听接受,有点懵逼,有点不好理解,放心,跟着我来,一定能懂,但是你要能吃苦。下面。点开这个方法。首先。这段。This,完了,我输了吧?这个刚才讲过了,不要着急。过来。就是我们的刚才的奥米对象本身就是我们这儿谬出来这个对象,谬出来的对象是不是在堆里面,说白了是不是在内存里面,那么根据我们讲过的GMM内存模型,相当于说主物理内存的初始值是不是就是这个共享变量就是五同学们第一步能跟上。好,接下来跟着我来VALUE2该对象的是吧?该对象值的引用地址就是value of set就是杨哥刚才这写的叫内存地址偏移量,就是我说的假设我现在想叫,想叫哪个同学站起来,我没有你们班的名册。
01:14
没关系,我不知道你叫什么名字啊,但是我直接就说第三排第四列这个位置的同学给我站起来回答我这个效果是不是比名字更准?像一个数轴对吧,那么一样,Value of that就是内存地址。Y64需要变动的数量,Y64在这儿我们说过了,是不是每次加个一。VALUE5是通过VALUE12找出的主内存的真实的值,就是说。这个对象VALUE2在这个地址目前你是多少,那么目前我们这个VALUE5是不是刚好就是我们刚才的这个五啊。好。用该对象与当前的值value进行比较。干嘛呢?
02:02
如果相同,分心VALUE5加VALUE4,并且返回处这一步听到就是。这个对象。这个地址与我们的VALUE5比较,如果返回处就是Z到这个括号,这返回处我们的值根心,根心的话就是Y65加Y64是不是Y64是一,咱们是不是加个一,那么同学们。这个返回错,前面取个反整整个Y是不是返回false,返回false循环就跳出来,那么这个时候干嘛。Return。相反,如果不相逃。注意继续取值,然后再比较,直到更新完成成功为止,那说白了,这块是不是有可能出现多次循环啊。那么言下支线,后面我们会讲一个东西干嘛叫自选锁。
03:01
思想就借鉴于他,说白了,什么意思啊?抬头重点。为什么要用CSS?Size加锁,同一时间段只允许有一个线程来访问,一致性得到了保障,但是并发性下降。我们用CS啊,请看它这用的是do和Y啊,我没有加锁,我可以反复的通过CS比较,直到比较成功那一刻为止。这样我是不是既。保证了一致性,又提高了并发性啊。能理解,所以说咱们不要着急,到这儿我看同学们,你们班有80%的同学已经明白了,那20%的同学不要着急,杨哥再讲第四遍。假设AB2个线程同时执行get and。Int操作。
04:01
由于大家现在都是多核了,你们是四核CPU或者八核的。现在呢,CPU是四个线程是两个,那么这个时候你跟我讲是不是A线程在一号CPUB线程在二号CPU,最简单的能跟上。请看两个线程来操作get and at in这个操作get and at开工。第一步。Intel里面的value值,假设原始值为三。当然,我这是不是写的是五都一样能跟上。好,也就是说主物理内存高。奥米尔的value值为三,根据GMM模型线程,A和B各自持有的一份值为三的value值的副本分别拷贝到各自的工作内存。同学们第一步能不能跟上?那么言下之意还不懂的同学。我们呢?
05:01
这个能不能跟上。好,我们再不懂的同学,那我非给你讲懂过来。顺便复习前面的GMM内存模型。什么顺带再搞,这些都是非常难的底层知识啊,但是熬过来,你就有进大厂的面试机会。面试官,他会觉得你跟其他的九零后不一样,咬咬牙。我拉。现在。就有这么回事儿。Auto里面的value值,原始值,这个共享变量是不是三。内存中的主内存中的奥特米的值就是三,根据GM模型,这个线程A和线程B各自持有了一份为三的Y6值的副本,分别到各自的工作内存,现在这儿有一个三,这儿的这个共享变量就是现在我们的这一句O吧。
06:11
好,这有个三,这有个三,AB各自持有,那么请看第二步。线程A通过get in81拿到三,这个时候干嘛?刚好A被挂起了,因为多线程这种调度什么时候执行,什么时候被挂起,是不是带CPU和底层调度啊?好,这个时候同学们请看。第三步,线程B。也通过得到三,此时B没有被挂起,执行比较并交换了这个方法。这个时候干嘛?他逃走的值是三。现在没有人动主物理内存的这个值啊,是不是也是三一比较为错,希望值是三,真实值啊,是三一拍即合。
07:07
加个一,三加一是不是四线成B,打完收工一切OK,同学们能跟上,注意,现在主物理内存的值已经被B,线程从三改为四,最新值在这块已经变成四了,到第三步同学们能跟上,好,现在。此时。A醒过来了。他也执行这个方法,发现自己手里面的数字数字三,我刚才是不是被挂起睡着了,我现在的是这是三和主物里内存的数字四不一致,说明该值已经被其他线程抢先一步动过了,听懂。那么A线程本次修改失败,只能重新读取再来一遍。这叫比较并交换,我这是三对于A线程,但是这个已经被B改成四了,那么三和四不一样,希望值和真实值现在是不是负了?
08:07
没办法,只好干嘛。Y啊,再过来一次啊,听到那么我们现在的这个值啊。再得到对于A线程而言,这个最新的值是不是就是四了?好,那么接下来再看第五步线程A重新获取value的值,因为value的值被value修饰,所以对其他线程对它的修改是可见的,对吧?图线程A继续执行这个方法进行比较替换,直到成功,那么同学们。12345这五步就是这个底层代码的原理的详细讲解,要求同学们现在默默的读一分钟,考虑考虑。那么OK,那么给大家做了一下课堂小练习。了解了一下这个,那么呢,我们呢,下面的文文档读完以后。
09:04
最后。大家来看看这个源码。再倒过来研究一下,彻彻底底的理解什么叫CS,那么呢,要理解老师所说的它其实这个底层。干嘛呢,就是我们刚才所说的,按说类。加cns的思想,那么说白了,这种是什么呢?直至什么比较并交换,直至比较成功,对不对?那么言下之意就是什么自学?好,那么这个什么自学,这是什么东西啊,老师到后面我们再讲,你先听一嘴那么好。我们往下翻。在底层。那杨哥他凭什么?能够搞定呢?因为不要忘了。
10:01
CPU并发言语,那杨哥这个并发言语长什么样啊?打那么厉害,比枷锁还好使,而且保证你是连续的,执行过程中不允许被中断,因为这一步。也就是说compare,也就是说再直接说吧,就是get and at这一步的更底层的是什么呢?那么就是靠的这个底层汇编注意。非计算机专业的不要求了解,你听一遍就行了。你懂最好,不懂无所谓。来。UN shift栏中的come and swept in是一个native方法。该方法在这。巴拉巴拉,这些就是CPU原选偏硬件的底层汇编红色部分。就是保证你原则性的依据。他的意思是。汇编奥,只要有这种前缀告诉你就100%是原子的,不许中断,这就是我说的假设。
11:03
出来半高,他的专车是五部,这五部车一定是连续的,不可能有中间有别的车来加三。那么这个时候干嘛?C MP X change积compare派X值并比较嵌积,那么X来实现X是即将更新的,只要一是原内存值的。影下之际,我们就会明白按C当中。更底层的话来说,它凭什么有本事保证不加SY就能保证原子线,靠的就是底层汇编偏CPU原始的指令来保证它,那么呢,也是什么思想,也是某个地址上的值如果一样,它允许你修改不一样,那么咱们是不是。不OK啊好,那么这个就是我们底层汇编那么简单版,我们小总结CS。比较当前对象工作内存中的值和主物理内存中的值相同。
12:06
执行,否则干嘛继续比较,直到主内存和工作内存中的值一致为止。第二个CS的应用,三个数,内存值、旧的预期值和要修改的更新值。当且仅单预期值A和内存的值相同,就是真实值和期望值相同,我们才能将这个值修改为B,否则什么都不做再进行。自我。旋转的,四弦的,这样的循环比较,直到成功为止,OK,好,那么这个就是我们CAS的相关的底层原理。
我来说两句