00:00
那么这个重复机制完了以后,在他这里边呢,咱们顺带呢说了两个事情,第一个呢叫呃线程安全问题当中,我们以前讲懒汉市的时候呢,说呃有安全问题,下面呢我们就来解决了一下,呃这个比较简单一些,大家呢能够把这个代码写出来就可以了啊这呢,我就从。直接我们粘一下它吧,CC。CTRLV一下,这呢,我们算是写了两种方式,哎,大家呢建议使用方式二,哎,多加了一个判断,这个呢效率呢就会更高一些,哎,那么修改完以后,我们就使得当前的这个懒汉市是一个行程安全的。嗯,这是一个健身安全的,那面试当中如果呢,这个题目就这样写的,说写一个线程安全的单理模式。你怎么写?单立模式你怎么写啊,你是不是可以写欧汉式啊,就是当初咱们讲冰向对象时时说过的那个欧汉式啊,也可以写懒汉式,但是懒汉式的话呢,你写得写咱们上边这个是吧,哎哎,就别写以前的那个啊,以前那个呢,不安全,好这就没了,然后接下来一个叫死锁,死锁呢跟以前讲的死循环一样,是需要咱们避免的啊,是需要避免的,这呢我们也写了一个例子。
01:34
首先呢,是对于这个思索理解就不同的线程呢,分别占用对方需要的同步资源,不放弃啊都在等待,那对方呢先放弃,这呢就构成了思索,哎你就想这个,咱们说你吃饭时候拿筷子那个事儿,哎,你拿了一根,别人拿了一根啊大家都在等待对方呢,去先给了自己是吧,这时候呢就僵持下来了,嗯,那具体的说明,哎,我们说呢,哎出现词错以后,没有异常,也不出现提示,就是卡到这儿了,阻塞了,诶无法继续,然后呢,我们写代码的时候呢,大家要避免出现失错。
02:09
啊这样啊,具体的举例的话呢,咱们是自己写了一个这呢就是这个例子。嗯,从哪粘的行,没方法CTRLC一下,咱们自己写了一个例子,大家能够体会这个过程就行,这里呢涉及到两个,这个同步加热器啊,一个S1,一个S2,一个线程呢,先拿一后拿二,一个先场先拿二后拿一,哎中在他们各自先只拿了一个的时候呢,哎,这个都在等待对方的这个呢,就出问题了。啊,就是这个情况啊,啊这呢是思索的这个问题,咱们呢,这边又写了一个,呃,是直接粘过来的啊在咱们课件当中有这样的一个题目,大家下来呢,你也可以看看,这个代码量稍微大一点了,哎,你去分析一下,它怎么就构成死锁了啊行,这个呢就不多研究了,能清楚这个逻辑就行,我们写代码的时候呢,大家要避免出现失缩,接下来线程通信,诶线程通信相较于我们讲的同步机制呢,其实要简单一些了,在这个通信当中呢,咱们哎先呢是写了一个例子,就是实现两个数呢这个交替打印,哎这样的一个例子,通过这个例子呢,咱们引入的这个通信,这呢涉及到三个方法的调用。
03:25
Wait notify和notify all。好,这是三个方法的调用。那么具体的说明啊,就是说呢,我们这三个方法的一个理解,我们这呢,写了三个点。嗯,这个呢,都比较简单,Wait notify notify,首先必须使用在同步代码块或同步方法当中。这个不能用,那个lock不能用啊,Lock怎么用,这个大家就不用关注了啊,这个你主要还是看这个就行,然后第二个呢,就是这三个方法的话呢,三也出不来。
04:02
还少个三,这三个方法的调用者呢,必须是我们的同步监视器。啊,必须是用同步监视器来调的,那你要是同步监视器用的是Z次啊,那这三个呢,就前面可以省略Z次了,但你要这是一个显示的某一个对象,那这时候呢,必须呢,就是用那个哎,同步计然器这个对象呢去调。那另外呢,就是三个方法,它是定义在我们object当中的。啊,这是这三个问题啊,那么object当中呢,呃,你会看到咱们这个胃的方法呢,除了空参的,它还有代餐的。Object啊,这整个接口了啊,嗯,Object这样进来。嗯,看一下,嗯,Wait wait啊,这三个wait notify notify all啊,这不是wakeup all啊,唤醒所有的线程或唤醒一个线程,嗯,这个weight呢,我们用的是这个也是咱们多数情况下呢,选择的方式,除了这个之外呢,还有这两种。
05:05
啊,这呢,就涉及到在指定的这个时间结束以后呢,它就结束这种阻塞状态。啊,还有这样两个,这个在咱们这个昨天看这个state,它这个状态的时候呢,里边提到过这个事儿啊,呃,一种呢是呃必须呢通过notify去唤醒的状态,一种呢,就是超了这个时间以后呢,它就自动唤醒的一种状态了啊接入这个阻塞的,那这个呢,咱们用的稍微少一些啊。好,那么这块这个面试题,就是咱们考试考的这个题,他们二者有什么不同?哎,这个问题,嗯,不同点,不同点这写一个这样啊,1123这样。好,这个大家呢,就呃关注一下我们说的这个不同点,这个面试题的话呢,也是比较高频的,大家能够用自己的语言呢说出来。
06:02
就是你你就是你答这些问题的时候呢,还是得稍微熟一点哈,就是呃你别呢,就是这个想半天啊,最后呢也答出来了,这个呢体验就还是差一些,说明呢,还是不熟啊,还是不熟啊,就像说的大家呢,你这个呃想面试或者平时跟人交流的时候呢,如果这个眼神你老是往上这个看,呃往上看呢,就是知道你在在想。是吧,你比如这个题你不熟,你在想,哎当时讲的时候是怎么着的啊,你往上看这是在想,然后呢,你要是左右看呢,左右看始比较紧张,比较比较比较慌张了是吧?哎往下看呢,就比较不自信了,甚至有可能呢在在在编是吧?啊一般有人说谎的时候呢,就是爱这个呃,这个这个往下看是吧?啊怕对方呢识别出来了这个自己的这个点啊啊戴个墨镜呢,这个他可能就会问你眼睛是不是有问题是吧?啊行,就是这两个啊区别需要会啊然后后边呢,我这放了一个总结,总结呢就是哪些操作会释放锁,哪些不会释放锁,因为这里边正好涉及到sleep跟wait啊,一个呢不释放啊,一个呢释放。
07:21
啊,那这上面这俩呢,我们说结束阻塞这个状态,那这个方式也不一样,它呢通常是时间到了就结束了啊这个呢,我们得notify一下啊,这个我们往这写,那这个呢,大家也应该清楚啊。然后释放不释放这个事我们系统做一个总结,这呢其实就在我们的PPT当中。嗯,在应该是在上面。好在这儿把这个呢,直接咱们拿过来就行,其实呢,大家一看呢就都能明白。
08:03
这是示范所的操作。不是王锁的操作。好简单的来看一下释放锁的操作,释放锁你当前的线程呢,把这个同步方法呀,同步代码块呢,正常执行完了啊,那自然的就释放了,很好理解,再一个呢,就是你在同步代码块或同步方法当中,你执行到break跟return了。这个也很自然啊,这break return你想是一个方法,那不相当于正常结束了吗?那方法结束了,其实自然而然的也算是回到第一条了,再一个呢,就是你出现一些异常了,出现异常了线程都结束了。那更何况你这个锁了是吧,它也会释放啊,下一个呢,就是我们调用weight了,哎说过调weight呢是会释放的,哎这是这个事儿,然后然后呢,这个不会释放sleep不会。
09:00
啊,特别明确的就是Li呢是不会释放的,然后这个业务的话呢,也不会。那他把这个CPU的执行权贡献出去了,你可以做别的这个跟这个问题没有关系的那些,呃,其他的进程是吧?哎,但是呢,你当前这个进程里边这些线程如果还是一个同步的话啊,业务的呢,它没有释放啊,那另外呢,就是被挂起的时候叫send被挂起了,这时候这个线程呢,也没有释放锁,他也没有释放锁,然后呢,如果你还没有给他去唤醒别人呢,如果也挂起过,哎,这个时候呢,就有可能导致这个死锁。所以咱们说这个suspend呢,后边就不用了啊,哎,咱们看API呢,说suspend跟resume它俩呢成对用,同时呢,已经被DEP就过时了啊,不用了,了解一下就可以好过了,下边涉及到JDK5.0新增的线程创建方式啊,这个咱们昨天呢,最后的时候呢,说的这个事儿新动方式一。在这里边啊,使用我们这个叫Co啊这个方式。
10:04
嗯,方式一,那咱们先把这个拿过来。嗯,创建方式一,它JDK5.0新增的这样吧,CTRLC。哎,到这儿啊呃,这块的话呢,大家可以我把这个代码呢,也顺带的粘过来吧,啊直接呢,你看它就通过这个代码呢来看一下就行。哎,这样啊,好,这是这个代码,然后具体这块说明的话呢,诶咱们关注一下,就是咱们讲到的跟这个renoable它的一个区别啊,哎,如何去理解,我们说这个Co这个方式呢,比较强大,哎这个大家来了解一下,这个面试的时候呢,呃,这个像collable呢,确实是要提出来的啊,比如说线程创建有几种方式,这column呢是要讲的,嗯,Column呢跟我们reno的这个区别呢,你也要清楚,它有可能呢,顺带另外就问你一下,他说columnful跟reable都是实验接口啊,相较于继承呢,很清楚啊,我们这个尽可能的选择实现就不继承了,那么这个实现的话呢,有两方式,那我用哪个呀?哎,那你说推荐的用com是5.0,我们新增的这个这个这个方式啊,那推荐用它,为什么呀,是不是就因为这123啊,哎,对就说出来,其实这些呢,有时候大家不需要死记硬背哈,你通过代码呢,一看这个就很清楚,通过代码你再回。
11:32
去说这个表达去面试题这个呢是接地气的,就你自己说了以后,你都很有底气,你要说这个自己都不清楚,代码也不知道什么样子,死记硬背的,那对方如果要反问一句是这样吗。嗯,是不是呢,那是确定吗?完了是吧?哎,本来呢,自己说出来感觉能达到90%的可信度,是这样吗?完了这下就降到60%了,所以说是确定吗?30%不对吧,0%是吧?啊他有的时候面试就是炸你的啊,当然了你也不能乱说,明明你自己不知道,你在这胡说哈,嗯,确实面试有过这样的人,就是他不清楚,他就自己在那瞎编,当然这个问题吧,其实很多时候面试官他抛,他有时候面试的时候呢,这个问题,呃一些呢是很常见的,或者他很熟的,也有时候呢,是他正在做开发,他开发中呢,遇到一个问题,他这时候呢,还不知道怎么解决,诶正好你不是面试吗?就顺便问问你是吧,诶说你这个问题你遇到过吗?你怎么解决的,其实他也没有,呃,他可能有一个思路,但是他也没有具体的去写这个操作呢,他也不知道该怎么去去做呢,具体的是吧,然后呢,一问你,你这块呢,其实你也没见过,然后你开始编了啊,有的选手就这种啊。
12:46
特别能说是好事,但是呢,你别乱说啊,然后编编编了以后呢,其实人家对方呢,其实也不太清楚这个到底是行不行啊,那可能就啊点头一下怎么样的,哎,大家说说思路,你呢,给了一些具体的方式,回头让人家一试,不对,那你就完了,你知道吧,这人肯定不能要你自己不会吧,还瞎说,还坑人是吧?啊这个不行啊,哎,这个呢是这个说明啊,通过这个代码呢,大家你去记这个事,这样的话呢,人家一面试他,他再怎么炸你,你这个错不了啊,代码就是那样子的是吧,这个新增的第二种方式先能值。
13:29
诶CTRLC,诶使用线程池,然后呢,这块咱们把这个代码呢,不放我就拿过来了,CTRLC一下,好,这个大家呢可以看一下。成,然后呢,这块呢,说明就是大家呢,关注一下这个线程池它的好处啊,真正这个咱们在开发中呢啊,那选的呢都是线程池的,你要说是一个特别小的一个点啊,就是用不着呢去造个线程池,我们就临时的就造个分线程做一个小事儿,这你就自己拗一下行啊这自己拗的话呢,有时候也经常爱用那个匿名的方式了啊,那你如果说是这个,呃,这个大量的线程需要被创建,然后呢,执行的时间也不长,又被销毁了,这个时候呢,肯定不会自己去用的,那一定是用的线程池,那这的要去关注一下这个线程池的一个好处,后续呢,咱们还会讲数据库连接池,他们的好处呢,是一样的,那这个理解呢,那个呢也很容易理解啊,然后全程创建方式啊四种,那具体的话呢,就是咱们讲到的这个和这个一共加起来四个啊行没了,这就咱们这一章的这个,嗯,内容其实呢也不少,嗯,重心的话呢,也翻来覆去说了创建方式和同步。
14:50
嗯,那会呢,咱们做的这几道题找同学答的感觉一般是吧,不是特别好啊,那么不清楚的下来呢,要整明白。
我来说两句