00:00
接下来给同学们介绍一下,好日子到头了以后开始有第二个线程来抢夺了,哎,不再是你一个线程长期持有了。我们要涉及到一个概念偏向所的撤销,那么在进行理论知识的讲解之前,那么来同学们请看这啊,这个时候是什么?Only one,那么这个时候就是偏向锁,我们前面强调过了,很爽对吧。多次都是同一个,不用捅到重量所那size没有必要反复的切换,所以呢,这个时候呢,效率和性能极高,但是好日子是会到头的。同学们。第二个线程来了,我们来啊,那说白了这个时候呢,也就是我们的是吧,心量锁了啊,说穿了我还是不想捅到重量,所这个时候我用的思想是什么?CAS啊,你晓得的,OK,好,那么同学们,那么请跟着我来。
01:01
大概给大家呢做一下说明,那么现在呢。我们呢,来了第二个县城啊。假设。他呢要准备进来,但是现在呢,进来的这个人呢,是这儿。他在这儿要准备去抢,但是里面是有的呀,那他会怎么处理?注意。突然转过来了,进不去,里面有人用着呢,那我只能在外面是吗?CAS再来一次还是不行,再来一次还是不行,那慢慢的这个锁,如果。从一个变成两个,那么是不是从偏向变成氢量所了。那么如果多次。Cns假设还不止一个啊,外面有一堆,那可能又来了,假设又多了,长期反复的cns啊,我们都没有办法进去,那么再慢慢的升级到我们的重量所大致过程就是这样,好,那么下面我们先讲这个撤销之前,先再来复习一下我们之前持有所做的说明,在这儿才能说清楚它所谓的撤销。好,那么同学们,我们。
02:12
强调过。假设现在只有一个线程。我呢们直接去检查所里面ma里面的线程,是不是存放着自己的线程ID,那么假设现在日子还爽着呢,就只有一个线程,还是偏向锁,每次都是它,对吧?那么这样的话就是不需要再次加锁和示范锁,性能很好,那么我们呢。相,每次一比较都是相等,那么表示偏向所偏向于当前这个线程。不需要多次反复的尝试获得所,那么以后每次同步检查所的偏向与这个当前线程ID是否一致,如果一致直接进去同步,对吧?自始至终使用所的线程假设只有一个的话,那么很明显没有额外开销,性能极高,也就是说我无需每次加锁解锁都要去CS更新这个对象头。那么但是。
03:01
结合我们这儿。开始慢慢的有别的现场来了,对吧,甚至越来越多了,那么这个时候对不起表示发生了竞争。所已经不是总是偏向于同一个线程了,那么这个时候会尝试使用什么CS啊来替换mark word对象头对象标记里面线程ID。作为新的ID去登记。那么假设竞争成功。表示之前的线程不存在,因为有一种情况就是比如说啊。这儿呢,还是只有现成,我呢,刚好要进来了。OK,你呢,刚好也要出去了。OK,那么好,你出去以后,可能你就彻底走了,那么相当于说从A线程变成了B线程,从此以后还是一个线程。能理解吗?这种算是很少的极端情况,但是它确实存在,那么表示之前的线程A走了,不在了,Mawa里面的线程ID为新的线程ID了,所不会升级,仍然是什么偏向所只不过江山易主,从A变成B还是一个,但是如果竞争失败呢?那对不起,说明什么?你这个A。
04:10
在这个里面。同学们。长期持有,我外面这个B只能是反复的CSCSS在这儿给你什么绕圈圈。这么说能跟上,那么这种情况下,那么同学们,你晓得的,他在里面。不好意思啊,竞争失败,那么这个时候我们这个锁就会变为轻量级锁,那么才能保证后来的B也有机会跟你A公平竞争,好,这个是我们偏向所相关的理论,那么在撤销的过程当中,我们需要掌握一个什么东西呢?叫什么时候撤销所谓的安全节点来吧,第一个。当有另外的线程逐步啊来竞争锁的时候,就不能再使用偏向锁,你不能再这么贪图安逸了,我可能锁的升级越来越剧烈,会出现从偏向升级到轻量,当我尝试线程CS更新这个对象头失败,对吧,我这个B进不去啊,那么这个时候我会等到全局安全点,待会儿会说。
05:14
所谓的全局,全局安全点有点有点类似于我们Java虚虚拟机里面的STW,就是stop the word有这段时间可能不会有代码执行,它比较安全,那么这个时候我要撤销偏向锁,以后咱们再重新竞争,那么下面我们来看看这个是个什么情况来。首先偏向所是使用一种。等到竞争出现才示范所的机制啊,前面说过了,如果只有一个的话,我这爽着呢,我没有改革,我没有变革,没有变动的这个压力,对吧?这不挺好的吗?OK,没有外力,但是随着竞争加剧来了,那么这个时候当其他线程竞争所的时候,只有偏向所的原来线程才会被什么撤销,那么大家重新竞争来撤销,需要等待全局安全节点,也就说在这个节点上面没有字节码正在执行,有点类似于说一个饭店你要打烊的话,你是不是也必须要等到。
06:11
当前,在。餐厅里面的顾客吃完饭了,你再慢慢的把他们送出去,你不能说不好意思啊,我打烊了,给我马上滚,掀桌子把你踢出去,这不大可能,所以说需要等客人全部走完了,你才能打烊,打扫你的饭店,以即等到安全节点的时候,全局安全点的时候,要检查持有偏向所的线程是否还在执行,那么来第一种。A在里面呢?B、在外面抢。第一个线程A正在同步块里面,OK,它还没有执行完呢,其他线程来抢夺,不好意思啊,该偏向索会被取消掉,并出现什么所升级,那么这就是我们所说的我还在里面,但是外面已经来抢了,那么这个时候我们干完了,我不能放,但是这个又抢不到所升级吧,那么这个时候就会出现是吧,我们。
07:02
此时呢,我们这个所就会从偏向变成了轻量,但是此时这个轻量所还是有原来持有偏向所能够线成A所持有,他要继续执行同步代码,因为我还同步框里面嘛,我没用完,我的锁可以升级,但是你不能说我A线程还没用完呢,我还没吃完饭呢,你就把我赶出去,对吧,所以说这个时候A线程继续执行。原有的工作执行它的同步代码块,而正在竞争的线程B会进入什么自选等待获得该轻量所好吧,所以说A在里面吗?B只能在外面CS自选等好,这是属于A处于同步块,那么第二种情况。第一个线程假设是A啊,执行完成了,新方法退出了同步框,则将对象头设置成为是吧无锁状态,并撤销偏向所重新偏向,那么这个时候就是B要刚刚进来,A也刚刚完了,那么这个时候好说。我也知道有竞争了,那么大家重新PK,重新竞争,那么我将会从偏向锁把这个锁释放了,撤销。
08:07
OK,设置成什么状态?无锁状态重新偏向OK,有可能A彻底就离开了,我也不再参与下次竞争,现在还是。一个线程只不过由A变成了B。来,那么所以说我们整个流程。大家可以看一下。竞争线程CS更新对象头失败,B发现哟A在里面搞不定,那么我要继续竞争,那么等待全局安全节点的时候,暂停原持有偏向左的线程A。你们干什么呢?检查一下偏向锁线程是否处于同步块,就是在不在忙着,如果处于同步块将所升级,为什么轻量级锁没什么好说的了,现在呢,我们用完你要来抢。两虎相斗,各不相让,那么这个时候升级吧,那么这个时候升级为轻量锁以后我们呢,唤醒原持有偏向锁的线程AB,两个干嘛重新斗?那么第二种情况呢,是检查这个是否处于同步块,这个A已经退出同步块了,那么将所置为什么无所状态偏向所的所谓从偏向的一是为什么零,那么相当于说变成什么001这个这个时候唤醒原持有偏向所这个线程A,那么大家再来一局,看该怎么抢,OK,好,那么同学们,这个就是我们对偏向所撤销过程相关的讲解和说明,那么接下来我们会把从偏向所的持有到撤销以图的形式给大家做一下说明。
我来说两句