00:00
来复习一下咱们昨天讲的这个多线程,多线程呢,咱们昨天呢,就主要把这个内容呢,就全部讲完了,哎,咱们来整体来看一下高级里边的多线程,之前一天呢,我们是把进程线程程序的概念,并行与并发,这都是基本概念啊,讲完了创建多线程两种方式,最基本的继承R类,实现RA接口,这个呢需要大家掌握常用方法啊,这个呢,在使用过程当中,咱们也都基本上都用到了啊,熟悉一下,然后接下来一个主要的知识点呢,我们提到叫先生的生命周期啊,咱们刚才考试呢也考了,把这个图呢我们粘过来。在这个位置。好,这呢叫先生的生命周期在这里边呢,这个说明说明的话呢,我们呃说明一下这两个事儿哈,就刚才刚才咱们讲这个,呃这几道问题的时候提过这个生命周期,大家呢,关注两个概念。
01:08
第一个呢,叫做状态。第二个呢,叫做相应的这个方法。嗯,就是我们后续涉及到生命周期的时候呢,大家呢,需要关注的就是从状态A,嗯,大家关注这个说啊关注什么呢?就是以后呢,我们涉及到这个生命周期的时候呢,会出现的问题啊,就是从这个状态A,我呢切换成这个状态B时,那会涉及到一些方法的执行,那么你要关注A到B的时候呢,哪些方法执行了啊把这个方法呢,咱们通常都叫做回调方法。哎,哪些方法执行了,你关注一下,这是一个问题,另外一个呢,像咱们这里边讲的是这个多线程,多线程这块呢,不是这个意思了,多线程呢,是反过来是我某个方法执行了,导致从状态一到状态B了,这个方法呢,是咱们主动调的啊,某个方法主动调用,像上面这个呢,嗯,你你好像看不到它所谓的主动调用了,就是你只需要关注这个状态变了,你把那个方法呢重写一下,诶直接它自动就调了,我们叫回调方法了,下边这个呢,叫某个方法主动调用,我们自己拿了一个对象调了一下这个方法,比如说我们自己点了一下wait,点了一下转,哎,是咱们主动调的啊,那么我主动调一个方法了,导致呢,它从一种状态变成另外一种状态。
02:38
哎,这个呢,这个是咱们现在关注的这个呢,是以后咱们要关注的一些结构是这种情况的啊,这是这个事儿,然后呢,另外针对于咱们讲的这个现成的生命周期来说,哎,我们说呀,这个嗯,阻塞状态,多说一句,它呢相当于是一个临时状态。这个临时状态就是你可以阻塞没问题,但是你不能一直阻到结束也出不来了,比如说咱们那个死锁,死锁呢,其实他们都都阻塞了,这时候呢出不来了,这这不行啊,它呢只是一个临时的一阻塞是可以的啊,不能是一个最终状态啊,不可以作为最终状态。
03:21
嗯,然后呢,对于咱们线上来讲,最终呢,都是走向死亡的,这是最终状态。啊,这个大家注意一下啊,所以有些人这个乐观,有些人这个悲观,那就看你主要倾向于哪了,乐观的人呢,他更多看重是前边这些啊,悲观的人呢,就是看重的是这些是吧?啊这个看到这个角度不一样啊,就跟说说剩了一杯,这个这个一瓶子剩了半杯水,乐观的说呢,啊还有半杯是吧,悲观来说呢,就剩半杯了,那这个态度呢,确实是不一样子的啊。行,这个呢,先生的生命周期涉及到的这些方法,大家需要写出来,会写,接下来我们又讲了一个重点,咱们这一章当中啊,有两块重点。
04:10
嗯,对,第一个呢,就是创建多线程。对应的就是这个,还有咱们最后的这个。第二个呢,就是。处理线程的安全问题,就是说到的这个同步。哎,这块呢,既是重点也是难点啊,既是重点也是难点,代码量不大,甚至你可以说就加了个系奈别的什么也没干,但是呢,你这个对了,你得知道,哎,为什么对错了,为什么错,所以呢,你就需要对里边这个机制呢有所了解,现成的同步机制大背景。咱们从这写的代码大背营呢,就是来解决这个现成的安全问题,咱们呢,举的这个例子呢,就卖票啊,卖票当中出现的问题呢,就是有这个重票和错票了啊,这个咱们就叫做现成的安全问题啊,类似的呢,咱们讲这个单利的懒汉市啊,那边也有这个所谓的安全问题,还有咱们说这个你一个账户,你跟你媳妇去取钱是吧,那都是会有安全问题的啊,然后呢,我们从这个生活当中,你得考虑怎么去解决啊,咱们就提到了说呢,你这个人在,呃,这个窗口在卖票的时候呢,别的窗口你就得等一等,嗯,所以呢,这是我们生活当中的一种哎理解的方式,那么重点我们需要关注的就是Java是怎么解决这个事儿的,是怎么实现这个所谓的别的线程,这个这个线程在操作,别的线程进不来这个情况,这呢我们就提到了叫同步机制。
05:39
哎,这叫同步机制啊,那么同步机制具体的解决方案呢,咱们可以说呢,有几种啊三种对,这也是咱们后边写了。这个如何解决线上安全问题有几种方法,这也是一个非常高频的面试题。啊,即使不是面试题,大家自己也得清楚,你得知道怎么去解决这个安全问题啊,嗯,同步机制具体的三种。
06:06
嗯,把这句话呢,我们也粘过来。嗯,这样啊,嗯,然后呢,第一种同步代码块有个说明,第二种同步方法,CTRLC这个咱们都拿过来。嗯,然后稍微等一下,调一下格式,这呢是前玲珑,然后呢,我们又说到这个叫return lock lock我们写到。写到这了,这是第三种方式,嗯,这个顺序等一下我们去讲啊,先把这个,这是第三种CTRLC。这样拿过来这个方式二这块呢,咱们那会儿也考了,不是考了是口头呢给大家说的啊,就是关于这个同步方法当中的这个同步加视器,我写到这了,嗯,同步方法的总结好CTRLC这里边的一个核心点,就我现在粘出来的,大家呢,从上往下都得捋清楚。
07:16
好看一下,嗯,第一个同步代码块涉及到呢,叫同步监视器,需要被同步的代码,需要被同步代码呢,就是操作共享数据的代码,所以重要的概念共享数据,清楚什么叫共享数据,清楚哪些数据在操作共享数据,哎,哪些这个结构逻辑再操作共享数据,我们需要呢,包起来啊,这叫共享数据了,嗯,这个我们的要求呢,就是你不能大了,也不能少了,这个在这写着呢,然后第二个同步监视器,哎,毫无疑问,这是两个最重要的概念。啊,任何一个类的对象都可以充当,但是要求呢,必须要共用同一个数。嗯,哎,在实现哎reable接口创建多线程的方式当中,咱们呢,可以考虑使用这个Z来作为这个同步监视器,那么对应的在这个继承的方式当中,你看我这写的在继承类的这个方式当中啊,大家呢要慎用这词。
08:14
我没说不能用啊,还是具体问题具体分析,你看这个这次是不是保证它是唯一的这一个啊,哎,CTRLC如果呢,这个这次要不靠谱了,你可以考虑呢,就是让当前类本身去充当。这个有点长,那我就这样这样啊。嗯,补充这呢是写的这两个点啊,这个大家也不要去死记硬背啊,这个要去理解,你要死记硬背呢,今天记住了,明天就忘了啊,你理解的话呢,这个事儿是可以给你长久保存下来的。嗯,这是我们说的,呃,这样吧,把这个呢,我们加个红色啊,哎,这算是第一种方式,第二种同步方法。
09:01
哎,刚才也提到了,就是如果我们这个诶操作共享数据代码呢,我们就完整的生命在方法当中了,这个方法呢,甚至也不止一个啊,这一个这个这个它有好多啊,咱们今天来讲常用类,常用类里边呢,你会看到一个呢,叫spring buffer。S buffer就是相当于一个叫可变的字符串了,这个字符串呢,在本质底层呢,都是用叉形数组存的,这个叉形数组就相当于我们所谓的工厂数据了,然后呢,我们可以对这个字符串呢,进行比如说增删改查的一些操作,增删改查这就是各自的各个方法,这些方法呢,里边都会去修改我们的这个。差型数组了,那就相当于呢,你在操作这个共享数据,那么我们要想建立一个操作这个共享数据的一个线程安全的模式,你就可以把这些方法呢,都加上S的,咱们呢,就是今天讲的时候带大家看看源码你就知道了,我们加上S以后呢,就保证了,诶我们操作这个叉型数组的时候呢,诶都是安全的,你多个线程去操作呢,它也不会出现现场安全问题,当然对应的一个点呢,就是你的效率呢。
10:06
哎,会稍微差一些了,嗯,就是我们有多个方法都来操作它,那就多个方法分别呢,哎,声明成SNE的同步方法了,哎也不是说非得说咱们就得把操作共享数据的代码都得放在一个方法当中,把这个加上SQL net,这这不一定啊,可能是有多个的,哎你这个线程想调它,另外一个线程想调它,那调的时候呢,大家既然都在操作这个共享数据,那咱们都加上C控ne的说你这个线程A你操作的时候呢,你这个线程B呢,你就得等会,哎这个性能这不就稍差一点,但是咱们能保证就操作它的时候呢,就不会乱啊,这个你操作完以后呢,别的再操作。哎,它是一个安全,好,那么这个总结刚才呢,也说这个事儿了,这个我不再重复了,需要大家记住它,嗯,下面一个呢,解决线程安全问题的这个方式啊,线程安全问题我们跟上面这个统一一下啊,这个我就写成叫方式三。
11:04
这呢是我们JDK5.0新增加的一种方式。哎,孙级拉新增加了一种方式,这个具体呢,咱们使用的呢,目前叫return lock。啊,Return lock里边呢,涉及到两个方法,一个lo方法,一个unlo方法,这个小括号又没了,哎,这个大家呢,下来把这个代码呢也可以写一写啊,那么课下呢,有同学问说这个老师这个lock这种方式里边还有没有同步监视器呢?这个里边呢。嗯,没有了,他就不提这个叫同步监视器了,他就没有同步监视器了,但是大家呢,你可以怎么着呢,你可以把这个lock呢,就可以理解成是一个同步监视器啊,但它不是啊,你就别这样去想想它了,哎,为什么可以这样理解呢?你看咱们我讲的时候说了,但是我没有写这个代码啊。你看还记不记得,就是咱们这儿呢,是拿的这个实现的方式来说的,实现的方式呢,咱们说天然的是不是它这些数据都算叫共享数据了,对咱们下边呢,这不是造了三个窗口,三个线程,三个线程共用同一个W就是window,那就意味着它又共用同一个是不是lock呀?诶这个lock呢,对于咱们三个线程来讲是唯一的,这个呢让他去lock,这呢让他去按lock,就是你要一个线程呢,调了一个方法,相当于算锁住了,那其他的这个呢,就得等着。
12:29
啊,如果大家这块呢,你用的是继承的方式。继承的方式之后呢,这个呢,那你就要小心一点了,有可能是不是一个线程一个了,对这个时候呢,你这块要这样写,它就出错了,这个继承的方式呢,我就没有去演示,大家下来呢,你可以自己写写,你看是不是啊,你要是承方式呢,这块要这样写,下边lock unlock,你发现不好使。因为呢,你此时三个线程每人是不是有一个这个lock呀,哎,它就相当于是不是共用一样了啊,为了保证好使,你得加个static诶,所以说在处理这个线程安全问题这块呢,要非常的小心啊,就是你得保证你这个代码量不大啊,保证你这个代码对你脑子得清楚啊,得清楚,哎,这是咱们说的这个lock这个锁的这个方式啊,然后呢,面试题呢,这是其中的一个,就是让你对比一下S袋的和lock的这个区别,哎,就是S呢,不管是通过方法还是代码号,它都有对应的一对大括号,哎大括号呢出来以后自动的就把锁释放了,而这个lock的话呢,我们需要手动的去给它调一下unlo方法。
13:33
哎,它才能够诶保证你这个结束这个同步的状态,哎,这要注意一下啊,那么既然我们讲了这三种方式了,哎后边呢,咱们代码这块呢,也有一个说明啊,说呢就是大家呢,在使用的时候呢,一个优先顺序啊。哎,使用的优先顺序。这个使用的优先顺序呢,它是从哪个角度来讲的呢?就是这个算是叫性能吧。
14:02
哎,使用这个lock的话呢,比较灵活,哎我们自己呢,就是给它调一下lock这个这个开始同步,然后呢,Unlo就接入同步比较灵活一些,那么对于同步代码块,相较而于这个同步方法来讲呢,它呢,哎就要稍微这个性能好一点啊。因为同步方法呢,你就相当于整个方法就同步了,哎,而同步代码块呢,你根据需要哪块呢,是核心操作的,我就给谁加上啊,进入这个方法的时候呢,还不会同步啊,相对来讲要好一点啊,这块呢大家关注一下,那么因为呢,咱们这个同步代码块和同步方法呢,是JDK一开始有的时候呢就提供了,所以说现在你会看到,不管是源码也好,还是以后我们写代码也好,大家可能更多的还是习惯上去用诶同步代码框和同步方法。就是因为它出来的比较早一些啊呃,这个lock呢,出来比较晚啊,说推荐我们去用,毕竟是新特性,新特性既然能出来呢,肯定他是建议你去用了啊,否则的话呢,他就不会去写这个新特性了啊,建议去用,当然呢,可能更多的人呢,目前还习惯上呢去用这两种。
15:05
哎,你知道现在这个现状就可以了啊。好,这是咱们说的这个叫同步,大家注意的就是来解决现场安全问题啊,很多时候你写完以后呢,不一定对啊,还不对,你得回来去看一下这些问题哈,像我这个PPT里边放了一个这个这个一个小图哈,哎,挺有意思的。这个。嗯,这呢是一个门,这个门的话呢,谁都可以进啊,不太安全,然后加了一把锁,就是看着呢,就是解决了现场安全问题啊,这个关键位置能不能卡住了。对,解决这个宣传安全问题啊,解决感觉上呢,是解决好了,加了一把锁,结果呢。白家。就开了是吧,嗯,就是不是说呢,你把它处理了以后,它就没问题了,结果运行还不对,回去去看一下是同步监视器那块出问题了,还是呢,没有把这个共享数据的代码都包全呢,是吧?得看清楚啊。
16:10
乘这个呢,就是当成一个对比的一个小例子哈,来乐呵一下就可以了,然后呢,我们加上同步以后呢,就安全了,那这就相当于它的这个优点了,那对应的这个缺点呢,缺点呢也很明显,就是你在这个执行那这个共享数据的时候,操作共享数据的时候呢,它其实是个单线程的效率呢就要低一些,所以我们尽可能的去控制,诶操作共享数据,或者说呢,你拿这个C空袋子包着的时候呢,这段代码别包多了啊,包多了话呢,这个单线能这不效率就低了嘛。那就成这个样子了啊好,这呢算是一个呃,叫利弊啊,这个就过了啊行,那么在我们这一块的话呢,涉及到两个面试题,第一个呢,就是哎创建,呃,这个解决现场安全问题有几种方式啊,对比一下,这个呢,咱们就不多说了,上面这不都写了啊嗯,然后呢,这个对比一下,就是你把各自的能说清楚就行,下边这个面形呢,就让你去比较用size的和用lock的这个区别啊,这个咱们这不也写到这了啊好,这呢是这个面试题啊,就过了啊。
17:23
嗯,回过来再说一句,咱们现在讲的叫线程的同步,同步同步是吧,同步还有对应的一个词呢,叫做异步同步异步以后呢,大家也会听到提到一个词叫异步,异步机制,什么叫异步呢。嗯,对,就是不同步啊,这个很聪明是吧,这个解释的话呢,没毛病啊,嗯,那要问什么是同步呢。图异步是吧?啊,这个没法说什么了是吧?嗯,同步呢,你关注它的点是什么呢?就是我们同步也好,异步也好,它是针对的多个线程啊,线程的同步,线程的异步,多个线程,我现在有三个线程,什么叫线程同步呢?就这三个线程呢,你按说呢,都算叫并行了是吧?然后我呢,同步就是在这一段同步的过程当中,只有一个线程在工作。
18:23
其他先生在这边等待。咱们同步呢,解决这个安全问题呢,呃,解决安全问题用的叫同步,就是实现的点呢,就是你多个线程都过来了,这时候呢,我们只让一个线程去操作,其他线程等待,当这个线程操作完以后呢,别的线程呢,再再进来,在这个过程当中是单线程的,这叫同步。能理解吧?啊,什么叫异步呢?异步就是大家该走走。大家多个并行的去执行了。哎,这叫做异步,举个例子啊,比较典型的咱们还是形象点,以这个呃,手机的页面来说啊,大家呢,往上去滑动这个手机的这个这个一项一项的这个时候,哎,这个咱们说了这个主线程呢,帮你做的事呢,就是装这些文本数据往上滑,让你都能出来啊,然后呢,我们去提供了很多的分线程,去提供这个图片的下载。
19:15
啊,这呢,这不就相当于我们在这个页面当中会有很多的线程,有主线程,也有很多的分线程,那么这个主线程呢,它现在在工作着,分线程是不是同步的也在工作着。因为他在去联网下载这个图片嘛,对吧,那么此时的这个下载图片的线程跟我们这个主线程他们就是一个异步的关系,就是我这块呢该滑滑,你这块呢,你该下载你下载,如果说你这个图片下载完以后,诶你回过来的时候呢,你告诉我一下我的这个主线程,哎,我呢主线程帮你把这个图片呢显示出来。哎,就这样。哎,就是相当于这几个线场,他们是同时都在执行,各干各的事儿,哎需要呢,相互之间通信一下,协调一下也可以啊,哎,就是不耽误,而这个同步呢,就是只能是这个时间段之内,就这一个线程在做,这叫同步啊,再举一个生活中的例子,就好比是啊,比如说你现在在咱们教室里边正在写代码是吧?哎,这个学习啊,下边一个哥们在楼下喊说啊,谁谁谁该吃饭了,他那是个前程,你是个前程,他喊你该吃饭了,然后呢,喊了你以后呢,如果他就不工作了啊,你这块再出去啊,就相当于你这个时候呢,你俩这两个县程不能同时执行了是吧?哎,这就像个单线程的一样啊,那如果他喊你说谁谁谁该吃饭了,喊完你以后呢,他这块呢,没等你,他就该走,他还走了,你这块呢,收拾了一下,你也下去了,一看他都走远了,你也跑几步赶上他。
20:44
就是相当于你俩线程呢,都其实一直都在执行着啊,这就相当于是一个异步的一个情况啊,行哎能理解一下就可以了,后边呢,咱们涉及到这个这个异步的情况的时候呢,大家再具体的去看啊好,这呢叫线程的同步机制。
21:03
这个先停。
我来说两句