00:00
各位同学大家好,接下来给大家介绍第三种锁,轻量级锁来。老规矩,从理论到我们的64位锁标记图,马克word所状态位的变更,再到我们的代码,再到我们的流程图,一套带走,打完收工来,同学们请继续跟着杨哥学习我们的所升级。首先它是什么?存在了多线程竞争,也就是说偏向所会撤销了,从偏向所升级到我们的轻量级所了,肯定存在着多线程的竞争,但是啊,任意时刻最多只有一个线程竞争,哎。不存在所竞争太过激烈的情况,也就没有线程阻塞。一句话。我们呢,以前只有一个。好说不麻烦别人,现在呢,你可以把它理解为啊,假设A在里面,B在外面自选,然后呢,他们两个啊比较默契,一个进一个出,一个进一个出,通过cns的。
01:03
自学完全能够搞定锁呢,确实有竞争,但不是太过于激烈,一句话还是尽量的不要往上捅,不要捅到重量极锁,OK,所以说呢,这个呢就是我们的轻量级锁,说穿了用CS替代阻塞,尽量不要阻塞好,那么它的主要作用首先。确实有现成来参与所的竞争不否定,但是获取锁的冲突时间极短。就是可能等了几。很短的纳秒级别,马上你也获得了,哎呀,确实有一丁点,哎,这个竞争,但是呢不是特别严重,所以说呢,本质我们就用自选所的CS这种思想来解决这个矛盾,那么下面我们64位图再看看所谓轻量级所来前62位指向线程占中所记录的指针,后面两位就是什么零零,OK好了,那么下面我们来看一下天量所的获取和对应的状态。
02:03
首先。我们来看一下。尽量所是为了在线程近乎什么GT直线的同步跨时提升性能,哎,注意有点类似于什么一个在里面,另外一个在CS,这样交替OK。非常的什么近乎这样的交替之行,非常的呃,清亮,所以说他呢。主要的目的就是在没有多线程竞争的前提下,通过CS减少重量解锁的使用,那么操作系统互斥量new text lock产生的性能消耗,说白了咱先自选不行了,咱们再统往上捅,那么升级的时候,当关闭偏向组的功能或多线程竞争,那么关闭了偏向组的功能是不是直接捅到了我们的轻量级所?第二种就是多线程竞争,偏向所会导致偏向所呢?升级为轻量级所,也就是它要么是直接到我们的轻量级所,要么就是从偏向所升级上来。好,那么现在我们的流程大致是这样一个。
03:02
假设线程A拿到了锁,线程B又来。抢,那么由于该对象的锁已经被A拿到了,那么当前这个锁就是偏向锁。而新城B在争抢的时候发现。对象头mark word中线程ID不是B自己的线程ID,而是A,那么B就会进行CS操作,希望能够获得锁,此时线程B的操作有两种情况,第一种,如果锁抢成功了,B抢成功了,那么直接替换Mac中的线程ID为B自己,以即从A到B重新偏向于其他线程,那么也即将偏向所交给了其他线程,相当于当前线程被释放了,所该线程会继续。保持偏向锁,那么A线程结束,B线程上位,那么此时还是什么偏向锁?只不过当前线程ID从A变成了B1,零幺的坐标之位。假设。我们这个线程B。来进行偏向抢夺的时候,所失败了呢?那么则偏向所就要升级为轻量级所,那么设置偏向锁的标志为零,设置锁标志位为零,零,那么此时轻量级所由原持有偏向所的线程持有,OK,继续执行其同步代码好,那么也就是所升级以后由原持有偏向所的线程,也就是那个A持有,但是现在A这个所已经从偏向变成了轻量,那么A继续执行同步代码,而正在进程的B就会进入自选,等待获得该氢量所,那么如果成功了,那么改为。
04:35
锁标之位改为零零,OK,好,这个呢,就是轻量所它一个获取的过程,那么下面我们来做一点补充说明。首先轻量锁的这个加锁啊,它是前62位都是指向线程战争中的local record这个指针,最后两位是变成零零,那么Java虚拟机啊,首先说轻量锁的加锁,Java虚拟机呢,会为每个线程在当前线程在战争中创建用于存储所记录的空间,就是它官方称之为displayed ma,假设一个线程获得锁的时候发现轻量级的锁,那么就会把这个锁的什么。
05:13
Ma word复制到自己的display ma word里面,OK,两者会有点像共用缓存一样。然后线程尝试用CS将锁的对象头的这个马二替换为指向所记录的指针乘高。当前线程获得锁失败,表示八块已经被替换成了其他线程所记录,说明在与其他线程的锁呢产生了竞争,那么当前线程就会尝试使用是吗?自选锁来获取,一句话,成功了,我上位,失败了,CS我在外面转圈轮着来,那么自选C说穿了也就是轻量锁的核心,不断的尝试去获取锁,能不升级就不要往上讨,尽量用CAS。替代阻塞,尽量不要阻塞,那么对于尽量锁这个加锁过程,你就记着在这块啊,有句重要的话,后面我们会说,会把锁的马word复制到自己的dispat。
06:09
PLA的这个markwa里面,OK,它会有一份,这个指针指向它复制了一份,那么对于我们尽量解锁的这个示范,那么好,同学们请看示范的时候,当前线程会使用CS操作,将这个ma中内容复制回所得MA2的单中。如果没有发生竞争,那么这个复制操作会成高,如果有其他线程因为自旋多次啊导致轻量所,那么如果说轻量所这个阶段也摆不平了,越来越多的线程,那么到最后会设成重量级锁CS啊操作失败,此时就会释放锁并唤醒被阻塞的线程,那么这个时候就是后面的了,那么咱们下一节重量极所好,这个就是轻量级所获得的线程。和获得现场所它相关的理论知识。
我来说两句