00:00
下面我们继续通过上面我们已经明白了CS比较并交换到底是什么意思啊,那么接下来我们呢,代码说话,再从硬件级别的CPU原语底层汇编给大家说明一下。它到底是什么原理,能够通过不加锁还能够保证原子性,那么再涉及到我们的源码分析好,那么同学们来。下面呢,我们先来个integer,那假设啊,就跟我们刚才所讲的这个呢,就是五好,现在呢。过来干。我们呢,Compare and set比较并交换,那么诶,这是set呀,你刚才写的是swap,同学们下源码大家看。底子是不是都这个,所以说set是swap都可以好,那么它的意思呢,是有两个值啊,同学们看一下,一个叫期万值啊,一个叫什么更新值啊好,我拿的初始值是不是五,那么我去做操作,我希望回来的时候。
01:01
别人没有动过,我很乐观的认为别人没动过,对吧,你看希望值是我,如果我拿的时候是我做了一定的操作准备,写回去的时候也它呢这个值呢也还是我,那么我们就把我们的值改为2022这么说。能跟上OK,好,那完了以后。假设修改成功,我们来看看当前这个奥里面它的最新值分别是多少?好,那么同学们请看,此时只有一个内线程对吧?也没人来争抢。大家漏一下第一个。返回的什么是个不尔之啊,怎么着比较并交换这个操作能不能进行下去,可不可以成功,那么这就是我们所所说的相不相等,相等的话,这一圈能不能走,能不来,同学们请看,希望值是五,更新值是2022,所以说我们现在得到的值是2022,那么再来同学们,我们不妨再执行一次啊,再执行第二行。同样的代码,大家看一下它的效果是什么?我相信如果你要是听懂前面的,我觉得这么一个简单的DEMO应该难不倒你,OK,那么大家都清楚啊,我拿的时候是五,改过一次之后,现在里面的真实值啊,是2022,那么如果我还希望它是五,类似于说假设别的线程也来改的话,发现抱歉,拿的时候是五,现在已经被其他线程改成2022,那么现在我这个五根本不是原来的预期期望值,这次比较是失败的,所以说只能是force,怎么着重新再来一次好,那么这个就是cns最简单的API的调用,这个API的调用底层的思想就是cns,那它凭什么能保证?
02:38
又不加锁,又能保证我们的数据一致和安全呢?那么来,同学们来看看硬件级别的保证。走,同学们请看,CS是JDK所提供的注意非阻塞原子性操作,它是通过硬件保证了比较和更新的原子性,首先它是非阻塞,且自身就具有原子性,那么也就是我们这儿的这个奥米in非常爽。那么就是这玩意儿呢,效率高,因为它不用加S增的重锁,不牵扯到用户态和内核态的切换,而且通过CPU原级别的硬件保证这个玩意儿更靠谱。CS呢,它底子呢是CU的一条原子指原子指令,待会我们讲汇编的时候会给大家详细说明,你先混个眼熟,那么就是compare。
03:23
和我们的嵌体指令,它不会造成所谓的数据不一致啊,它底子呢是有个叫UN类,哎,怎么这有个什么Una,这又是什么东东所提供的一种方法,那么底层实现GVCP的指令是这么一个源于指令,当我们执行这个指令的时候,会判断当前系统是否为多核,那么目前大家都是多核系统的,那么不管。只要是成功,说明CS操作要成功,马上就要给总线加把锁,只会有一个线程会对总线加锁成功,那么相当于说多个线程在什么并发增强的时候ABC。我们不管,外面是千钧妈妈。
04:00
硬件级别的保证只有一个能进来,能够抢锁成功,那么加锁成功之后再去执行CS2,那么也就是说CS原子性实际上是CPU实现独占的,哎,它呢。这个独占相当于我们S,但是呢,它比比起来来用S这样的重量解锁这里的排它独占的时间要短很多,所以在多线程情况下,它的性能会比用single稍微好这么一丢丢,那么来接下来呢,同学们刚才呢,不是提到了一个东西叫UN safe类吗?那么我们慢慢,其实这块啊,大家的话都清楚,讲这么一个API的调用不是我们的本意,重点是底层的源代码和我们的汇编,那么来同学们,我点。大家会发现,原来我们调的compare and set这个对外暴露的API。噪是掉了一个东西叫UN safe类,它又掉了一个compare and swap int,那么分别是this value of that、希望值和更新值。这个this就是指当前对象,这个value of set,那么就代表当前对象这个内存地址的偏移量,就是说这个对象里面的这个地址它的值是多少?如果和切换值是一样,返回错就修改,如果和切换值不一样,是false,那么抱歉本次操作。
05:22
不OK,所以说底子是有一个C类来支撑的,那么来同学们,我们呢,可以看一下它的底层源码,我们这儿呢,都给大家写好了,那么来我们再往下翻一层,大家请看。啥native,哎,只要一涉及到native啊,大家都清楚,第二个是底层。第三方或者操作系统的这些原语级别的函数,那么所以说这三个你看我们用in套或者long或者其他对象分别有1245,那么这些参数啊,都给大家呢,进行了源码的抓图,其实大家请看也就是这三个啊,不是我乱写,本来我认为是1234,但是它底层是1246或者1245什么之类的,那么来吧,来说一下上面这个三三个方法呢,你搞定一个,其他呢都是势如破竹,都一样,首先V1,那么就是表示要操作的对象,好,那么在这块我们返回去所谓的这个V1,就是我们这表示要操作的对象this,当前对象第二个叫value of that,那么这是啥?
06:24
表示要操作对象中属性这个地址的内存地址的偏移量就是这个对象里面的哪个地址的哪个值,那么V4。表示需要修改数据的期望值,那么也就是我们这的这个expert,那么如果是错,期望值相同,没有人改过更新,否则false放弃或者重来,那么V5V6表示需要修改为新的更新值,那么所以说我们在这儿就是这么一句话,那么引出来一个问题,也就是CS思想完了以后,它的考点主要是给你考这个UNC类,那么在在这儿我们先大致说一下,面试的过程当中一定要懂UNC类,因为说穿了原子类靠的是CS这种思想,CS这种思想那么怎么落地实现的,靠的是按C类的CPU原语级别的汇编操作,但是工作中请不要用UNC类,你用不好的名词都可以告诉你了,是不安全,它容易导致内存混乱。好,那么同学们,我们来下节给大家说一下面试题的考点啊,S。
我来说两句