00:00
接下来我们先来第一种。Object当中的wait,很多方法实现现成的等待和唤醒通知机制,那么来吧,笔记都给大家整理好,那么下面我们代码说话,那么建立新的包,Com哔哩哔哩。这个包下面support DEMO,那么来等待唤醒通知机制啊,那么。很简单,那么现在啊。我们假设啊,Object。Object lock等于6OBJECT,那么现在呢?我们来了。第一个线程第一,那sized object lock他要干的时候,那么同学们呢,都清楚是不是要先持有这把锁。这波没问题吧,好。那么现在呢,我们呢?直接进来了。和之前的一样。OK,好,那完了以后,我们现在呢,在线程T1里面。
01:04
Object object lock这个所直接调用我们的方法那。同学们都清楚,一旦我调用这个位置方法,我是不是交出我所的控制权?别人去争抢,但是我就在这儿。被阻塞,停停着OK好了,那假设。我到最后。有wait,有notify。收到这个通知了,那么这个时候就是我们的什么。被唤醒同学们没问题吧?好的,那假设啊,我们这儿呢,还是一秒钟。现在再来一个线程,就是我们的T2。啊,这个T2呢。改发一下,和之前呢也差不多新的,那么对于这样的线线程。你要使用。Wait和notify,你是不是先要S同步块里面才能去正常使用,那么这个时候大家请看我们object lock第二。
02:08
楼梯这么说能跟上,然后完了以后在这儿。我们。直接过来。他呢?发出通知,OK,那么意思就是一开始T1先启动,T一进来了,Wait马上我就要停止,然后呢,一秒钟以后T2行程也启动了,立刻发送个弄梯发通知,那么现在T1和T2都持有同一把锁,谁抢到谁用?另外那个等待释放了以后再去抢来吧,同学们请看。此时这个我相信大家呢,应该没有任何问题,非常和谐,T一进来了,一秒钟以后,T2发出通知,T1被唤醒,程序正常结束,OK吗?好,那么同学们这个呢,就是我们所编写的正常情况的这样的一种,OK,那么来同一把锁类似同一个资源,那么这个时候我们呢,就不再废话好了,接下来。
03:06
啰嗦的是这两个异常情况。那么来,同学们。现在呢,第一种。杨哥呢?把这个synchronized这个块。先给你住掉。那么大家请看最右边,貌似语法好像没有报错吧,没有红色的对吧?啊,黄色的咱们不管,那么下面我们要带来第一个问题,如果说失去了SNCH这个锁块,单独的使用wait和notify。还。可不可行,好不好使?那么来,同学们,我们跑一下。此时T1COME in,说明线程确实进来了,但是马上报了两个异常,分别是不合法的模模,我们前面说过是不是对象的。监视器我们的管程,那么监视器状态不对的这么一个异常,那么来这个是谁发生的。
04:02
20行,那下面这个呢?Notify这个是谁发生的33行,所以此时此刻是报了两个异常,数量上是两个。出事都叫monitor state exception,那么得到我们的第一个结论,如果我们要使用wait和notify,必须将它。包在size的这个锁块之间才可以,也就是说你必须要先持有锁了你才能用,OK,这是我们的什么第一个异常情况来。为的方法和多的方法,如果两个都去掉这个同步代码块了,大家都看到,那么异常情况我们都OK,好,那接下来我们呢,再来看看。回复。回到我们正确的状态。那一般我们都说synchize wait和notify,那么现在我们按照这个程序的顺序恢复了所块synchize这个同步代码块,那么为在前,Notify在后,挺和谐的,那接下来同学们我们来试试,如果给它顺序对调,也就是说。
05:09
先启动notify,再来试试wait,给顺序反过来,那么大家看一下好不好使,那么。对于这一行代码,我们把它弄到这儿来,T1线程一进来以后怎么着?停一秒钟,注意并没有持有锁呢,听懂,那么这一行代码将其注掉,那也就是说现在内线程刷刷下来,T2首先先启动,那么T2先拿到它notify,然后发出通知啊,那么此时先notify,再wait,大家看一下还行不行,那么来同学们,我们跑一下我们的程序。等一下后台结果,大家请看,T2绝对已经进来了,发出通知,如果能到这一行,说明这一行搞定,此时大家请看一秒钟以后,T。
06:02
也开始运行了。看说明T1也持有这把锁了,但是一到wait了以后,大家请看,出现一个可怕的现象,程序在这耗着。相当于卡死在这儿,程序并没有正常的退出,成功的结束。所以说我们突然发现貌似这个顺序是必须要遵守的,那么答案是肯定的。我们得到的第二个异常,那就是将notify放在wait方法前面,也就是说notify先执行,再执行,Wait程序无法执行,无法唤醒你,这个唤醒的这个人就已经先跑了。OK,然后我有沉沉的睡去,没人叫醒我,相当于闹钟坏了,OK,所以说同学们,这个就是我们得到的通过object类。Wait notify方法实现等待和唤醒它正常写法在左块里面,Wait notify,但是这两个异常要注意,那么总结一下第一个。
07:04
Wait和notify方法必须要放在同步块或者同步方法里面,OK,最好是什么成对的出现,第二个使用顺序上,先wait后notify方才OK,所以呢,这个是我们第一种情况,这个三角形它有两个限制。要有它才有两边,OK,而且wait notify,顺序尽量不要颠倒,且成对出现,好,那么各位同学,这个就是我们的第一种实现,以及它的两个异常情况。那么接下来我们来看一下用第二种情况会带来给我们什么样的问题来,那么现在呢,先把这段代码呢抽取一下。那么我们这个呢。就是新考,那么这个呢,就是wait和。我发。OK,好,那么第一种我们就给大家先介绍。
我来说两句