00:00
各位同学大家好,我们继续那么讲到这儿,到此所了以后我们呢,对Java的琐事的介绍将会暂告一段落,后面的内容暂时不再继续,上半场到此为止,那老师下面这些该如何处理,为什么不继续讲呢?那么大家可以看一眼。对于下面这些章节,都牵扯到底层源码的深度分析,我们需要有一些前置知识,比如说学完了后面这些章节,哎,再回头去读源码。比如说线程中断,洛克斯Java内存模型GMM等等,那么这个时候带大家去看源码,才能有这些前置知识,打好基础,我们才能够更好的消化和吸收,而且后面这些内容将会比前面的所的内容更加的晦涩难懂,所以说需要有一个良好的基础,正所谓基础不牢,地动山摇,那么故此我们将这些内容放在后面。那么接下来。我们呢?
01:00
将会对我们目前所学的东东,本章所的内容上半场进行一个小总结,诶,那么大家可以看一下啊,嗯。你平时呢,工作996,回到家里以后,我估计也已经是累得快崩溃了,几乎是没有时间自行学习总结,即便你看了书。你可能也没有时间去写这些代码深刻的体会,所以说强烈建议大家,如果可以的话,请坚持把这门课从头学到尾,日常工作当中,你是很难有时间去看书的,对吧?一到一个技术难题的时候,由于平时加班就已经没有太多的精力去提升,碰上一个技术瓶颈,如果平时没有积累,没有看书,那是很难立刻想到方案的。所以说呢,希望各位同学能够坚持到底的学习,正所谓书到用时方恨少,钱到月底不够花,那么希望大家跟着杨哥继续深度的学习。好,那么接下来呢,我们对我们所学的内容呢,做一个小小的总结,哎,我们的学习方法理论实操小总结三板斧。
02:03
复盘,复盘再复盘来,各位同学,那么我们学了些什么?第一个。八锁的案例,我们锁到底锁的是些什么东东?那么我们用八种情况给大家深度的讲解了什么是对象锁,什么是类锁。第二个公平所和非公平所,主要就是指多个线程在强所竞争同一份资源的时候,采用的策略是公平还是效率优先非公平所谓公平,那么自然而然大家吃相都好看。雨露均沾,每一个线程或多或少都有机会获得,哎,那么非公平呢?那就不好意思了,就是群雄逐鹿,谁先抢到就是谁的,那效率上非公平非常OK。可以避免线程之间的切换,马上有线程拿到,也许是同一个,那么这样呢,是抢到的越来越强,抢不到的会产生所饥饿的状态,那么它的好处避免了上下文切换,坏处有违公平原则,好。
03:07
那接下来同学们请看一下可重入锁又名什么?递归锁?我们所谓的就是同一个线程持有同一把锁,自己进入自己的内部,方法以后可以自动获得锁,不会导致死锁。OK,这个也是一个非常重要的知识,甚至呢,我们说过隐示和显示,尤其显示锁re lock,一般要显示了自己加锁lock了,几次UN lock几次lock UN lock尽量一一配对。好。第四个知识点,思索及排查。什么是死锁?死锁导致的原因如何写一个死锁的案例,你有哪些方法,哪些命令可以断定现在程序卡死了就是死锁导致的?哎,GPS这样的命令要求大家掌握,那么最后这一切下来,主要是为了给大家研究S,而且think底层对应的C语言是object莫所谓的持有所和管程的概念,那么尤其是SNCH,我们也给大家从字解码和C语言的底层源码给大家做了一个说明和分析。
04:12
那么这个希望大家务必掌握,我们给大家回答过为什么任何一个对象都可以成为一个所来吧,最后复习一下一个最重要的这个知识,Object,莫,那么这张表呢,我们已经看过多次,呃,也找到过这个对象给大家看过object monitor HP,那么这个里面就有很多关键的属性,比如说谁持有,谁等待,嗯,持有阻塞队列,可重入锁的次数等等等等。那么这些结合我们的如何运行的呢?那么接下来。这是我们本章最重要的一个小总结。来,同学们。指向指针,指向模对象,我们前面强调过,我们呢最经典的是不是用SNCH的同步代码块,哎,在这块是不是传一个石有所的这么一个对象,这个线程持有所进来了以后,谁抢到了,说明哪个线程占到资源,执行里面的业务逻辑和方法,那么这个对象它呢,是一把重量级锁,也就是我们的S,它是这么个映射的。
05:16
指针指向莫尼塔对象。这个莫塔对象我们前面介绍过,叫管程,或者也叫监视器锁,诶,每一个线程里面呢,都要持有它才能真正的获得锁,那么每一个对象都有这么一个东作,我们借莫尼塔,那么每个对象都存在着一个莫尼塔与之关联,当一个莫尼塔被某个线程持有后,它便处于锁定状态。那么在我们的Java虚拟机当中,模是由object模来实现的,它的数据结构主要是这样的,主要就是object模,点HBP,以及前面我们看到那几个属性。来,各位同学。对于我们的synchize this同步代码块自解码指令,我们晓得这个时候是不是叫monitor en表示加锁,Monitor exit表示解锁,一进一出相对的示范。那么加了锁以后,我们的object monitor。
06:09
他是怎么干的呢?首先它的属性主要有这几个,欧锁定当前对象的线程ID。那么这个。当前线程抢到了,自己加个编号就说明时有锁的线程是谁,第二个看它,那么它的次数记录着表示当前所对象是否被锁定。加锁加个一,解锁减个一,那么这个是代表我们的可重入锁的重入次数。它同步代码块的重入次数,每进一层加个一,出来一层减个一,对吧,外层,中层内层,那么n list是阻塞队列,Wait是等待队列,好,那么这些属性我们粗粗的过一遍,接下来我们看一下流程,那么从上到下,从左至右来。同步代码块自解码指令是monitor en进入,那么开始加锁。首先它会来判断。
07:04
那么这个对象里面的count它是不是零?如果等于零是错,表示当前所对象没有被占用,哎,没有人用吗?还是零,那么执行加锁操作,那么太好了,这个线程强锁成功,那么加个一指向当前线程。我抢到这把锁。然后在这块我们的进入重入的次数,进入只有一层,那么我也就加个1OK,然后执行同步块架中的方法,就这那么如果说判断它等于零是force呢?表示当前所的对象有人站着,哎,我去了以后不好意思有人占,那么来判断这个欧呢,是不是自己有人占有,可能是自己,有可能是别人。如果是自己,说明是当前对象锁的现场,那么后面照旧执行,如果是否,那对不起,说明现在有人占了,但占的这个人不是我,那对不起我只能进入现场的阻塞队列,N吹list,好,这是我们的加锁进入的流程,那么有一天我们要业务逻辑执行完了出来呢?
08:08
模塔exit是解锁,那么前面说过加一个叫减一个,类似于我们的洛克啊洛克对吧?那么层次要退一个OK来判断这个是否等于零,如果是,说明从多层S当中全部退出,然后擦除欧,就相当于这个object莫管程持有所的这个线程被干掉了,说明我已经示范锁了,对吧?这个线程用完了。如果这个是否说明没有从多层当中完全退出,那么可能只是退出了,可重入的话呢,只是退出了其中的一层,好,而O呢,保持不变,还是自己OK。所以说这个就是结合我们的object莫再结合我们的字节码S所底层映射,结合我们的C指针,给大家做了一个简单的总结和回顾,好,那么希望大家坚持下来,能够跟着杨哥把这门课彻底打通。那么对于Java琐事,上半场我们就暂告一段落。
我来说两句