00:00
那同学们坐好,我们接下来呢继续开始上课哈,那刚才呢,我们呢,为了给大家呢复习,也就说了一下这个传统版的县城通信的生产者消费者机制。然后呢,在下课的课程的过程当中呢,有同学呢,来问了我这么一些问题哈,那么这块的话呢,我呢,刚才呢,也就统一的回答一下。第一个。首先有同学来说这个。洛。Re lock现在我们用这样的写法,它和synchize有什么区别和不同?那么将将好,我打开了这个我们的提点,大家看synchize和洛有什么区别?那么首先哈,这个题目呢,在杨哥的GOUC2019版的时候是详细讲过的,那么如果同学们忘了,OK,没关系,咱们再复习,待会再跟大家讲。第二个呢?是。又有同学上来问,以前呢?杨哥是不是之前画过这么两个三角形?
01:07
这个三角形说过了,以前这是size。然后这儿呢是什么。Wait,然后这儿呢,是什么,Notify。然后慢慢的哈,这边过渡了以后,这块是不是变成洛克了,然后呃,根据我们前面讲过,这变成什么。然后这变成什么signal。这个时候的话呢,相当于说以前这个是老版本的,那么这个是新版本的,那么。有同学呢,就会有疑问,就是说。我们这块用这个替代了以后,有什么样的好处,感觉呢,体会的呢,还不是特别深刻,那么好,干脆这样呢。我们呢?为了更好的找到工作,我们踏踏实实,认认真真的来解决这些问题。第一个问题。
02:01
Size和洛克有什么区别?那么虽然说杨哥以前讲过了,但是现在我再讲一下。那么不妨说,我们先解决完第一个问题,我们再来说砍地上啊洛克这些问题。首先。我们来看一眼哈。那么。假如说。我们来看看这道题目。Snchize和洛有什么区别?用新的洛有什么好处?要请你举例说一下。那么这道题确确实实也考过,我以为呢,不用多废话了,但是既然有同学来问,那老师呢,还是再讲一遍。大家讨论一下吧,我先暂停一下录屏。好,那部分同学呢,呃,答出来了三点,有些同学答出来了两点,起码呢,第一条我原来讲过的同学们呢,都回答上了。第一个我们来复习。Size属于什么GVM层面,它是Java的关键字啊。
03:02
那么洛是属于什么API层面?它是JAVA5以后新发生的一个类,那么换句话说,我们第一个维度要从它们两个的原始构成。来说。首先。Snchize是关键字啊,属于GPM层面,那么我们原来用这个汇编语言呢,给大家演示过synchize底层是个啥呀?底层是不是主要就是这两个东西,Monitor ENT和monitor exit,进入和离开。那么底层它是通过什么monitor对象来完成的?而且我们当时强调过wait和notify也依赖于monitor对象,所以只有在synchize或synchize同块里面才能调用这两个方法。那第二点我们来说过lock是什么具体类锁嘛,那么主要是Java u q,看current包下面的locks这个包下面它是API层面的,那么你一定要搞明白,一个是关键字啊,个是具体类,那么我来给大家复习一下,我们再来看看。
04:07
首先哈,那么呢,我们呢,直接呢,过来这么一个动作。如果我SYNCH。This,那?或者说直接就是什么尿。Object,那这种代码同学们肯定写过。那假如说我们现在你re rocks,那言下支线现在我们呢。直接这么干了以后,是不是相当于说在这个main方法里面同时写了一个S同步代码块,又写了一个洛克,那么这个时候我们要用Java p这个命令来瞧一下。来答,我们原来讲过哈,你看这什么方法,我们。折开了以后好好看一下,我们讲过,只要是这个锁,其实底层主要是用的是什么东东。
05:00
模拟它,那么这个就代表进来,那么这个呢,代表。出来,那么。都讲过,而且还重复的说过什么概念,我们首先来看。来,我们拖大一点哈,如果上面是用真空袋同步关键字,OK,没问题吧,那么来,同学们,我们干嘛?Monica锁的监控器进来。出去,而且我还一再给同学们强调过,为什么这个是一,这个是二。会出现两次对不对?好,那首先我们说过了,这个如果加锁了进来,它有底层有一个计数器加个线,而且synchize它是属于什么可重入锁。那么第一个叫正常退出,第二个那么。异常怎么办呢?要保证你永远要退出啊,对吧,那么所以说干嘛我们呢,就像是有两种保险,正常退出,异常退出,总之一句话,Size保证你不会产生是吗。子锁,或者说一些底层的一些故障,因为正常退出和异常退出,总之可以给你退出了,不起,我就报个异常嘛,能给你出来。
06:10
但是第二个你看re en lock,我们一定要强调,一个是系统级别的,一个是新的类,干嘛,你看颜色也不一样嘛,你有这个时候是黑色,这个是不是蓝色什么意思啊,这个是不是叫关键字啊,你看我们尿什么东东?它出现的是这么一个动作,说白了什么,我们这是new出来的,所以说一定要明白think。用的是莫。在公有思杨哥的课上详细讲过,那么这这块不展开了。为什么是两次啊,正常退出异常退出好,而洛克是这么一个动作,好,那么。接下来这是我们的什么呢?第一个维度叫什么?两者的构成?那第二个维度是什么?使用方法?那么怎么用synchize不需要用户去手动示范,刚才看过了它是不是有个monitor exit这么一个。
07:04
那么当代码执行完,我们就自动释放了不起,最极端的情况,你报异常了也能给你放出去,程序都错了。那但是呢,洛克是需要什么手动,那么。我们都明白,一定是要强调lo unlo try翻点。TRY的上一行落final里一定是落安落,那么你不落就会思索,我们在前面的可重入锁上面演示过,好。这是第二个维度,使用方法上来说,那第三个维度呢,等待是否可中断,那么什么意思呢?我们呢。都清楚。Size是不可以中断的,也就是说你加了锁了,除非泡一查或者正常运行完成,一句话进去以后。干嘛你就完活,要么是正常完工,要么是抛一产,他不可以是,哎哎,哥们,你已经加了S,出来出来出来出来出来没有换座位的可能。
08:05
但是呢,洛克。可以中断,它比size更加的灵活。那么什么意思呢?我们讲过goc那门课,我们杨哥详细讲过两个方法。第一种设置超时出lock,那么我要拿锁,哎呀,就好比我现在去卫生间前,里面呢,有个哥们在坑里面蹲着,然后呢,他还在里面打吃鸡,我看他等了老半天了,我按照我这比方说,我等个一分钟他没有出来啊,算了,我去其他楼层去上厕所。那第二种呢,就是什么look interrupively,这个时候是什么,可以调用interrupt方法直接给你中断,那有点类似于我现在呢。突然有个什么紧急的事情,我可以离开,那么所以说是否中断这个size不能look可以好?第四个维度枷锁是否公平?对于枷锁是否公平,我们着重讲解过。那首先我们大家都明白SYNCH的。
09:03
默认非公平锁,那re lock默认是什么锁呀?好,我们同学们说的很正确,我们都知道它呢,两者都可以默认,也是什么锁,非公平锁,那么这个时候干嘛,我们一定给大家讲解过,说过什么,你看用一个以后。Unfair synchize,什么意思啊?相当于你什么都不写的时候,默认就是false,那么这个等价于使用这个创建了一个原程的实例,默认等价与构造方法传负四,那么大家一看我这没有负四,我们大家都明白,如果这你看。无非就是说你不传也就是掉这个,下面这个方法我们之前也讲过干嘛。非公平锁好,那么这个我们快快的过一下洗一下,那么。继续。如果说不尔直负出公平,负为分公平,好,那么第五个,那么大家看一下,我们也详细说过。
10:10
绑定。所要绑定多个条件的condition,那么呢?干嘛snchized根本没有condition这种说法,而属于ancient lock呢?就用来实现分组唤醒需要唤醒的线程呢?可以什么唤醒?注意这句话,干嘛精确唤醒,而不是像synchize,要么随机唤醒一个,要么唤醒全部。我们都知道synchize,我们刚才画了两个三角形,它是不是用notify和notify war呀?那么现在假如说我们有这么一种情况呢?不好意思啊。在。Size的时代。你没有condition。你没有办法多种唤醒。那么这个时候,同学们清楚。使用还是非常坑爹的,什么概念呢?也就是说你notify。
11:04
这。假如说不好意思啊。要一大堆线程,那你到底是唤醒哪一个呢?我们呢并不是很清楚,但是现在抱歉,我们现在呢有一种需求,我要求你要么不唤醒,要唤醒,我不允许你什么全部唤醒,或者说不允许你随机唤醒一个,我要求精确唤醒,点穴打击,那么这个时候干嘛我要求A。能够唤醒BB,能够唤醒CC,能够唤醒B,假设过来,然后abcd。ABCDAABCD永远是这个顺序,有点类似于同学们的什么周一到周五的排班值日表,好,周一班长值日,周二这个时候我们让葛梦思值日,周三我们让王帅,周四我们让孙红值日等等。那么言下之意,不妨我们把。
12:05
这道题目。再和下面这道题目,我们来搂一眼。干嘛呢?多线程之间要按顺序调用,实现ABC3个线程启动。要求如下。A打印五次,B打印十次,C打印15次,紧接着A再打印五次,B再打印十次,C再打印15次,来十轮。那么好,同学们,如果这道题目你要是用S写很麻烦,但是如果你用洛克来写的话,请看可以实现什么东东精确唤醒,那么这个时候就不会像S那样,要么随机唤醒一个notify,要么唤醒全部notify war,大家再过来争。好比老师点名,是不是大家都希望是点名,点名是不是最好是精确按照名字来点,那么呢,我们呢,来。看一下这道题目来复习,并再体会一下condition。此外。
13:04
Size和look的区别按照12345这五个维度,那么老师呢?粗略的再带着大家详细的复习了一遍。那。要求这道题目全班同学必须掌握啊,Think和洛有什么区别?这个说实话。必须。队给我汇,杨哥已经详细讲过很多遍了。接下来针对于第五种情况condition,那么大家看看这个题目,那么呢,要求大家现在思考一下。
我来说两句