00:00
各位小伙伴大家好,我们继续通过上一讲,我们对八种所的案例做了一个演示,八种情况分别所得是什么?你做对了多少?搞懂了吗?好,那么接下来没有关系,跟周阳老师我一步一步的带大家说清楚,接下来我们先把程序回退复盘一下,每一种情况到底锁的是什么。所谓的SYNCH啊,绝对不是一个英语单词啊,难着呢。那么结合阿里手册,再看看这小段话,它到底隐含了多少知识啊?什么叫对象锁?什么叫类锁?好,那么同学们请跟着我来。我们先回复到回退程序,到第一种情况,标准访问AB2个线程,好,那么不再是静态了。也没有暂停这三秒钟啊,我们第一种嘛,然后呢。我们的资源类都是用同一个缝机,那么相当于说回到最开始的小白兔的状态,对吧?诶。线程用同一部手机发邮件,B线程用同一部手机发短信,好,那么大家请看标准访问有AB2个线程,请问先打印邮件还是短信?那么这个时候大家都清楚这是最简单的是吧?两个普通同步方法也没有这一行了,哎呀,省得戳戳眼睛,我直接干掉,待会儿我们再加,也很简单,那么来同学们。
01:20
一跑,这个时候我相信第一种所演示的情况,大部分同学都回答出来了邮件和短信,但是结果正确。也许你现在。笔上纸上所写的东西一定是正确的,跟我的顺序是一样,先打印出的邮件和短信。可问题是,你真的认为你懂了吗?好,下面我来解释一下。部分同学。你的理解,A和BA现在呢是发送邮件,B是发送短信,那么他们两个可以同时进来。各回各家,各找各妈,那么所以说这个时候A可以进来打印出邮件,B也可以同时进来打印出短信,就这样,所以说最经典最正常的情况,那么就是先邮件后短信,你的理解OK,是这样吧。
02:15
如果屏幕前的你,你现在频频点头,那么我敢保证你对的理解是十分错误的,前面的说法绝对错误,OK。为什么呢?错在哪呢?同时什么意思啊,加了SYNCH,注意我们前面刚介绍过,它是什么悲观所独占所加了以后同一时间点有且仅有一个线程能进到这个资源内,而且我们来看一下,如果你觉得。不合适的话,那么请看我们第二种,暂停三秒。好,那么各位同学。如果按照你的理解是正确的,可以同时进来各回各家,各找各妈,A找邮件,B找短信。那么请问。现在我第二种锁。
03:01
A访问的邮件这个方法是要暂停三秒钟的,可是B访问的短信方法没有暂停啊,如果按照你的理解是正常的话,那么请问我们的运行效果应该怎么样?我们现在第二组。大家请看什么情况?这个邮件加入三秒钟以后,必须等我先用完了你的短信才能跟着出来,OKAB2个线程同时访问了我们的资源类,不好意思啊,你要等三秒钟,我不需要等,如果按照以前的结论,那各回各家,各找各妈,应该先打印出短信,再打印出邮件啊,所以说非常的抱歉。一定要注意第一种情况。我们只要在某个方法上加了snchize这个资源类里面,这个类里面可能有100个SYNCH方法,只要加了think的方法,其中一个被访问了,那对不起,我锁的不是锁这一个方法,是锁这个S方法所在的整个资源类。
04:05
OK,好,那么下面我们先说生活中的场景。张三李四啊,两位同学需要用手机,但是手机现在只有一部,为了避免两个打架,那么只能是枷锁,礼貌使用。假如说现在。张三先拿到手机,他要发邮件,李四后续拿到手机,他要发短信,虽然说你们两个访问的手机类的功能不一样,但是告诉我这两个功能是不是都在同一个资源类里面啊,哎,所以说一定要注意S锁锁的是这个资源类,而不仅仅是锁的这个方法,千万不要认为说啊,它只锁这个方法,所以说一二两种锁我们给他整理好。笔记总结。怎么来?各位同学,那么一二两所。我们呢,得到的结论。一个对象里面如果有多个方法。某一个时刻内,只要有一个线程去调用其中的一个方法了,其他的线程都只能什么等待,换句话说,只要你加了S方法。
05:10
某一时刻只能有唯一的一个线程去访问这些C方法,它锁的是当前对象,This被锁定后,其他线程都不能进入到当前对象的什么其他新方法,哎,虽然说AB2个线程用的方法不一样,但是这两个方法是不是都在同一个资源类里面,这个手机现在在A线程里面,那你可不是B线程,你只能等人家用完了以后你才能使用啊,否则的话S啊。我只能是保证一个线程访问这个,那它锁什么呢?数据一致性肯定受到破坏呀,OK,所以说请同学们一定要注意所谓的think所是所的整个资源类,OK,同一时间段。它只能有一个线程去访问这些S两次方法,那么结合这大家请看对象所内所来,也即。
06:02
所谓的对象锁,就是指我们现在AB2个线程没问题吧,用的都是for同一部手机,这个缝是谁?就是这个尿。FOR6出来的这个实例对象,也就是说的是当前对象,This OK new for锁的是等号,右边这个具体的实例对象懂吗?好,那么这个就是我们的第一所和第二所,OK,好。接下来第三一个添加了一个普通的hello方法,请问先打印邮件,注意还是hello,那么大家请看一下我们现在第二种情况,A线程其用的是三秒,依旧要停三秒,可B线程用的是什么哈,虽然说它也在这个类里面,但是抱歉我并没有和你争抢,不会和你产生静态条件。举个。例子,你现在A线程你要去用手机发邮件,但是B线程呢,用手机的是什么?
07:01
假设这个手机它自带的耳机或者充电线,虽然说这个充电线耳机或者这个手机壳也是手机的一部分,但是抱歉我并没有在功能性上面跟你一致啊,那么我们两个各玩各的,并不产生静态条件,所以说各位同学,我们接下来第三所。我们来产生回顾,那么对于B线程调用的是同一个资源类哈,再次强调哈,只是一个普通的实例方法,并没有think,我不和你争,我们两个没关系,所以这才是真真正正的各回各家,各找各妈。那么所以说同学们,A要去调用资源类里面的邮件,但是B我不跟你抢,我找的是哈,好比类似于手机,你用着去发短信,诶,你这个手机壳挺好看的。摘下来给我观摩观摩,所以说我去看手机壳了,你去发你的邮件,我们两个并没有产生静态条件好,这是我们的第三种情况。那么第四种情况,大家请看几个两部手机,那么我们都清楚啊,这个是最简单的,第一部,第二部你用了几次啊,是不是两次啊,那100%是不是两部不同的手机了。那么自然而然资源。
08:14
现在就没有产生静态和真强,说穿了A用一,B用二,那么大家觉得还强吗?所以说这个时候同学们请看一下。我们的运行效果以后会发现程序。先打印出来我们的短信,再打印出来邮件,理由是什么?A用的是第一部手机,调用第一部手机的这个方法,B用的是第二部手机,调的是第二部手机的这个方法,咱们两个确确实实加锁了,但是A加的是。负1B加的是负二,根本是两个不同的对象,两个不同的资源不产生静态条件,OK,所以说同学们这个就是我们的什么第三种和第四种情况,那么请同学们务必将其拿下。
09:03
好,我们接下来继续高歌猛进。乘胜追击,来,同学们跟着走。现在。第五,有两个什么静态同步方法,哎,在Java里面只要加这个static关键字,或多或少问题会产生根本性的变化,来几部啊,同一部手机,那么来吧,此时大家请看sta,我们呢?第五所和第六所,我们现在来演示一下,先看第五所和第六所,其实是1R121的关系,12221的关系,一题两面都这么一回事,几部啊?五是第五种情况是一部手机,第六种情况是两部手机,其他都一样。好,我们先演示第五种情况,那么用AB2个线程都用同一个对象。好,同学们请看。那么此时。两个方法已经从普通的同步方法变成了静态同步方法,那么请问我们先打印的是什么东东呢?那么AB跑起来看一眼两个线程。
10:02
此时,我们后台发生了等待。第五种情况,先打印出邮件,再打印出短信,OK,好,我们接下来再接再厉。变成第六种情况,两个静态同步方法,大家请看两个静态同步方法没问题吧,但是呢,是两部手机。A用缝隙,B用缝二好,那么此时我们来看一眼。他打印出来的谁先谁后呢?那么来再跑一次,大家请看,又在后台发生了等待,还是先打印出了邮件,再打印出了短信,也就是说对于我们的五六两种情况,它是一样的,这是为什么?那么还是那句话,你一定要深刻的明白,Synchize锁的是什么?Static synch又锁的是什么?普通同步方法和静态同步方法截然。不同的两种东西,那么在这儿请大家看什么锁类锁,它加锁的对象都不一样,听好。
11:04
先说结论,不管你是负一还是负二。你们两个现在是尿尿出来的东西,绝对是两个不同的实例对象,但是告诉我他们来自的是不是同一个模板?没问题吧,假设我现在啊,还有后面的六缝三缝四,我六了四个六,现在有四部不同的手机,四个不同的实例对象,但是你告诉我按照Java的语法,这四部手机是不是均来自于同一个类模板啊,就是我们的底层反射里面所讲过的那个class。OK,也就是我们来自于同一个模板,然后产生了不同的四个对象,所以说对于静态的东西,你锁的是最左边这个模板,加的是什么锁内锁,而不是我们六出来的实例对象锁,所以在这儿我不管你有几部手机,实际而言,只要你又调用了静态的同步方法,锁的都是最左边这个内锁内模板,OK,所以说五六两种情况非常非常的重要,那么来同学们。
12:14
我们来了,搂他一眼。看一下五六。都换成静态同步方法以后情况发生变化,注意啊,结合前面的。这个31234和五六来进行对比。三种生态所的内容是有些差别的,那么杨哥你这儿为什么只讲了一种呢?那么注意啊,我这儿再次强调啊,Synchized的,那假设啊,我们这有个对象是O。那么。也一样。这种是第三种,OK,叫同步代码块,好,我们下面来分说。这三种呢,所的内容有些差别的,注意对于什么普通同步方法所的是当前实例对象通常就是this啊,就是你溜出来的这个缝一,或者溜出来这个缝二,具体的一步部手机所有的普通同步方法都是用同一把锁,实例对象本身就是你溜出来这个。
13:06
第二个,对于什么静态同步方法锁的是当前类的什么?Class说过了,不管你后面有几个实例,对象均来自于同一个模板,就是我们的form.class唯一的一个模板。那么对于同步代码块所得是S括号里面的什么对象啊,其实是一回事。那么。这个说的是实际对象六出来的这个,这个说的是类模板,而这个锁的就是你括号里面这个对象,OK一回事,好,那么接下来我们就会明白了,为什么五六两个静态同步方法,管你是几部手机。都是一样的结果,因为说穿了都是A先拿到了这个静态同步代码的这个类模板的这个锁,他先挂载了这个类锁,OK,好,那么接下来如果五六你懂了,那么七八你马上也就秒懂来。这个是静态同步方法,那么这个是什么普通同步方法,我就是没说,只要你前面的五六听懂了,七八你会马上反应出来,那这个加的地方叫内锁。
14:07
这个加的叫什么对象锁,他们俩一样吗?OK,一个是你的学校大门,一个是你的学校里面宿舍的大门,这是两回事,好,那么各位同学,那么接下来。改造完上面的方法A。放。B。也用这个缝,一也用我们的缝,相当于说两个线程用的是同一个对象,那么这个时候大家看一下,我们跑一下,它产生的效果会是什么样呢?大家请看谁先出来了?B先出来了,为什么啊B。加的是J谬出来的这个实例对象锁,而A你玩的是个类锁,咱们俩加锁对象不一样,不产生静态条件和争论,那么这是我们的第七种情况,那么第八种情况几部啊,两部手机和刚才差不多,A去找的是缝隙,那么B我们找的是凤二。那么大家请看一眼,我们此时再跑一下,先打印出短信还是邮件呢么?大家请看一回事,是不是还是先短信后什么邮件呢?我们为什么敢这么说,因为你用第二部手机的时候,无非就是从它换成了它两个扭出来的实例对象,但是模板是不是还是同一个?OK,好,那么同学们,这就是我们的第七所和第八所相关的解释和理论依据来,那么各位亲。
15:28
看一下,当我们一个线程呢,试图访问同步代码块的时候,它首先是不是要先获得所,对吧?我们说过S是重量级所,那么要么是前者。正常退出了示范锁,要么前者他错误,他抛出异常也要示范锁,只要丢出来锁才能避免死锁和堵塞给其他行程用。所以说普通的同步方法用的都是什么同一把锁,就是我们这儿的叫什么多一项锁。实例对象本身就是你出来的这个它是把把不同的你一个就是具体是一个本类this。
16:02
如果一个实例对象的普通同步方法或者锁以后,该实例对象的其他普通同步方法必须等待获取锁的方法获取以后才能使用,那么结合我们前面一二,假设我们是用的是普通同步方法,那么锁的是这个Z出来的这个整个对象同一时刻只能有一个进到这个资源类里面,OK,好,那么接下来。什么方法,静态同步方法用的也是同一把锁,谁类对象本身就是我们这的什么类锁,一个是对象锁,一个是类锁,一定要分清楚了。这个实例对象,这个是模板,也就是我们所说的唯一模板,谁class,那具体的实例对象this,就是你列出来的这个,虽然说我来自于这个模板,但是不好意思啊,这个等号左边最左边这个和等号右边溜出来这个整体绝对是两个不同的对象,这两把锁是两个不同的对象,所以静态同步方法和普通同步方法之间是不会有静态条件的。哎,同学们这块一定要掌握,但是一旦一个静态同步方法获得锁以后,假设你拿了,那么其他的静态同步方法。
17:03
也只能乖乖的等着你。第一个信用完了以后,我们才能释放好。那么同学们。这个就是我们对扣的实操和最终的解释说明来。那么再说直白一点,如果对于第七和第八所,你还不明白什么叫实例对象,什么叫类对象,那么结合我们的手册和结合我们的GVM。来。阿里手册对象和类锁,你要是还不明白,切记。我们在Java虚拟机里面,我们也曾说过。Class类加载器,把你硬盘上编的一个Java小class读进来,注意请大家看这是不是有卡大class,这个就是类锁,这个就是模板,有一份模板是不是生成了三个具体的实例对象,这是三个不同的对象,但是均来自于同一个模板,就像我们这儿的,这是两部不同的手机,但是均来自于同一个模板,那啥意思啊?再说直白点。
18:00
各位亲,都晓得对于这样的内锁模板,在Java虚拟机的什么地方,方法区里面有且仅有一份。但是对于我们的对象,所六出来的实例对象在什么地方?在我今位我们的堆里面,每六一个是实例对象是不一样的,哎,所以说他们加锁的地方和对象都不一样,自然而然会产生不同的运行效果,好,那么各位同学请深刻理解C子到底是什么?八种锁的案例它到底锁的又是什么?好,感谢大家的聆听,这一讲就到这。
我来说两句