00:00
那各位同学。在。并发编程的过程当中呢,我们呢,需要看一下我们的。第四个。我们知道a list是线程不安全的,那么请编码写一个不安全的案例,并给出解决方案。那这个呢,也就是大家。基本上非常非常经典的是吗?集合类不安全的问题。那言下之意大家都明白,一定用过一个r list,这我就不废话了吧,那么这道题目呢,给大家呢,简单的复习一下吧。那么首先。经常考的是吧?那这道题有十问。那比方说你瑞。内测的话。假设我现在干了这么一票,好吧,在这儿呢,直接再写个阴气点吧。那么请问。第一问。当我new一个的时候。底层你有的是个啥?那注意啊,现在还不是我这道题目了哈,只是大家复习哈。
01:04
啊,那么大家是个什么东东。好正确哈,那么有同学回答呢,是一个数组非常正确,那么第二问他会问你。什么类型的数组?啊,因为大家都明白哈,这个r list的话呢,这个。点。List以后抱歉。爱的方法以后。你这写泛型,如果是整形。装整形string类型,装类型这个里面是不是也可以装其他引用类型啊。那说白了就是什么呢?你底层。一六的时候,其实质而言。打卡。是不是new了一个,你看构建了一个什么东东?Com list伴随着初始值是多少。十那么所以说那么这个呢,我们快快的复习。当你new了一个list的时候,其实这人底层就是源码,说这句话,New了一个空的list。
02:02
但是伴随这个初始值是多少,是十的,这个不是我们扯淡干嘛,这个是不是源码上面的注释啊,不可能错,那再不服气的话,我们看AP list。干嘛构造一个?Com list伴随着什么?初始值是多少?那么。欧了。那么这个element大家请看什么鬼?Object类型的数组啊。好,我们再来看。默认。空元素的时候大家看干嘛,也就是说你现在当为六的时候大家看。是个什么鬼?那这个十在哪儿体现呢?这块呢。他不见兔子不撒鹰,不见鬼子不拉弦儿。这个数呢?点二的时候,比方说丢个一进去,那么同学们请看干嘛?你看确认这个开始大小了吧,是不是这个size加上一了,大家请看初始值size是多少,我们都明白英特型的初始值是不是S都是零啊。
03:01
那么这些呢,前面的什么李玉婷老师,李老师呢,都给大家详细讲过,好吧,那么接下来我们呢,快快的走一遍。点ADD了以后,那么大家请看,弄到这那么O了干嘛?默认是这个的话,假设一开始要符合进来默认的capacity多大。是不是就是12,那么前半是不是跟AP。出来了。好,那直接说后面什么有I的以后啊,初始值是12,如果超过十了怎么办,超过十了是不是扩容,那扩容怎么扩,那么这个时候扩容的话,那说白了I的方法。噼里啪啦掉了以后,这块零加一干嘛是一,那么这个一在这个数组一这个位置上面,是不是添加一个我们后续的一种各种元素啊,那么这块我们来看这块干什么呢。它有这么一个动洞在。点开干嘛,如果说这块它计数器加了一个这个不要管,那么如果说干嘛还。
04:01
默认是不是十啊十假设加了一个以后,十减一是不是九,九是不是大于零,那么这块呢。开增增了各种一样,那么年下支线如果说。老的那个干嘛已经大于它了,我们这边括括多少是不是原值的一半,十的一半是不是五啊。十加五,最后15巴拉巴拉什么,这些快快的过不是我现在要说的重点。那么他扩容怎么扩?阿瑞点copyp,这个我就不多废话了,关键问题是刚才讲了那么多以后,他马上就会问你。I list是线程安全还是线程不安全的?OK,你看全班同学基础都非常棒。接下来坑爹了。马上跟你说,给我举一个alita线程不安全的case。我们先来看list,我们干嘛呢?List等于6LIST,哎呀,我相信这一行秒懂了。
05:05
那么来,兄弟们,我们大家干的是不是list点干嘛I?那么这这个我们就这么说吧,那么假设这么写,你看同学们能不能还有印象了。那现在假设是A。D。C。OK,没问题吧,那么例点干嘛呢?Stream up。For each,或者你直接对点儿。For each system out。Line怎么回答我?这个写法。有没有问题,方法也要。Consumers消费接口和流失。这是不是可以,刚才我是不是还得点零。什么这个写法,同学们能不能跟上啊?那么这边的话呢,行。
06:01
那假设有些同学呢?看后面那些同学呢,他可能跟不上。行吧,那我换回来这个呢,杨哥调整姿势啊,来适应你们行吧,我就是服务好姿势多行不行,你有list那么这块。过来吧,猥琐点爱的哎。C。那么大家熟悉的。这个时候。Element。我相信这个OK了吧。增强型腹循环,那么大家懂的。我这儿一直行ABC那不用讲。秒懂。那下面的问题是。你不说他线程不安全吗。咱们为什么在去年的从入门的学习到现在,同学们用艾瑞很少出故障呢?因为还那句话,大家当时学的过程当中,此时只有一个内线程,你单线程环境下面。
07:03
怎么你就是想出错都很难?那么牵扯到多线程呢?那么兄弟们。我们把这个已经懂的知识。去掉。看一下。哥们,我呢也不多。现在。三个线程来操作。这样的写法是什么意思?老师就不再多废话了,没问题吧?好,Lea。店。要一个string,那么优秀IDDR。Random to string第二。Sub,那么假设零到八。好。List。请大家看。首先,我们都明白I list的爱的方法。
08:01
你说他县城不安全,不安全在哪儿?是因为I的爱的方法。同学们都明白,爱。干嘛?这块有没有加,有没有加锁。根本就没有。这块要注意,I是线程不安全的回答正确,为什么线程不安全?因为他的爱的方法写操作的时候它为了保证并发性和效率。它没有加S,那么这个时候请大家露一眼。干嘛呢?我们现在上一轮安线程,下面不会出错,那么现在大家请看几个线程。三个,那么来看看我们运行的效果会什么样呢?同学们正不正确?三个线程要写进去干嘛?八位长度的一个字符串并打印出来。回答我正确吧。100%正确,这次运行效果非常好。
09:00
要不请你再多运行两次试试啊?什么叫线程不安全?就是某一个资源类,那么现在我们的资源类是不是就是个阿丽斯塔?他在多个线程的并发访问,下面来看看我再跑一次。哎。确实也是三个数量上对上了。但是居然。值和速度是不是跟上面的不一样了?兄弟们再看。所有的值你倒不要说,因为这个值是随机算这个字字符串的,跟上面的字符串不一样,不是啊,上面这个是不是不是那。第一次的时候,刚才那个正确的,但是现在是不是有难了,不是拼这个字符串一不一样啊。别胡说八道,别那个理解错了。我再来。哎。神奇了第三次。第一次正确。数量质量上都对,第二次数量上三个对了,但是有个那值,那第三次咱们看更加坑爹,两个数量上是开始不对了。
10:05
但是告诉我兄弟们有没有报错?很简单,我们这报错idea的工具后面是不是应该是红色,你看。出去的扣的是零的话,就证明正正常退出的没有报错好。你说的?30个。不过分吧,现在就是30个线程。来访问这个a list。兄弟们,Look。我执行。来。出现了Java u concurrent modification exception,那么这个就是什么?Ta线程不安全灶。在。高并发多线程访问下面的常见的异常。
11:01
那么假如说兄弟们。面试官经常会问的一个题目,尤其对于大部分出五个常见的Java异常。类型转换异常。但是突然如果有一个九零后会跟大家讲啊,我遇到的错经常是Java u concurrent modification except。恭喜你。面试官,今天面了这么多人,这一个星期面了这七八个Java程序员,就唯独有你这么一个能说出来。这个时候坦白讲,只要你干过电商,干过金融,干过银行这种并发类的项目,这种错是什么?就跟空指针异常一样,基本上将程权逃掉,我们来看看拆分什么意思啊。Goc老师讲过什么意思啊,是并发的意思啊。Modification什么意思啊?修改的意思,这个单词的意思类似于我们数据库里面的update,那么言下之意,这就是什么并发修改的异常。
12:04
那么好。给同学们十秒钟在。纸上写一下这个异常,并当场背下来。好。各位同学。那么。小练习做完。我们彻彻底底研究一下大家最熟悉的。你看大家通过杨哥带着大家到高级部分的学习就会明白。什么概念?你说阿瑞,我能说你不懂?哪个同学?到杨哥最后这个阶段了,不都是做过项目了,都用过,但是为什么会报错,那么报了错怎么怎么办?做一个优秀的开发工程师,你应该按照什么思路来解决这个问题?那么首先请同学们。注意。第一个干嘛。故障。现象。我们已经。知道了。第二个问题。
13:00
干什么呢?导致。原因。那么请分析一下。为什么会出这个事儿?第三一个干嘛解决方案。兄弟。只要能识别就能解决。那么现在。解决完了以后,如何以后杜绝避免同样的问题在发生。这个就是优化建议,什么叫优化建议?说白了就是同样的错误。头发。是吧?二。那么言下实际,这种思路就是成为一个优秀的Java工程师必不可少的方法论和思维环节。假如说你现在去上班以后你一定。会惹麻烦,出故障不出故障的驾驶产学我没见过。什么?坦白讲了干嘛?杨哥,怎么成为一个经验丰富的加成学啊?
14:03
She。正确的代码靠经验。那杨哥怎么能够?写正确的代码,获得经验,写错误的代码。能理解,但是错了,以后你不能说过了。你得按照故障现象导致原因解决方案优化建议。自己每次在工作中就要有一个word,自己的故障收集手册,这些就是你的工作经验。再说白一点。你在这家公司干个一年半载,跳个槽,跑到下一家公司,或者以后去面试美团、阿里巴巴、滴滴打车这样的大厂,所有的项目经理都会问你一个问题,你在上一家公司或者以前的项目当中,祭司印象深刻的故障。您就按照杨哥的这四个维度去跟人家聊。100%。言之有据,言之有理。还是那句话,杨哥讲这些课,绝对不是让大家背题。三个字的方法论,再说白一点,是对各位九零后软实力的培养。
15:05
那么呢?基本上北京混不容易,但是千万不要是只会撸代码,你这样走不远。坦白讲。练武不练功,到老一场空。技术就是武功,武功就是技术。基本上我一直推崇这个原则。我以为。天下武功,天下的技术。也即根本就没有高低之分,只有习武的人有强弱之别。那么所以说请各位亲,各位同学一定要明白。下面。导致原因。那么这个时候我们。待会儿讲,那么说白了。我们是不是先解决?给我搞定。高并发下面。怎么办?这个时候,大部分同学都会说,明白了枷锁。
16:06
哥,这是JDK的源码。那么这个时候,如果你能回到枷锁,好不容易你能说你碰上这么一个故障现象,哎。项目经理会高看你半眼,不能说一眼。我们也要谦虚,外面高手如云,要踏踏实实啊,但是你说枷锁迅速就掉价了。兄弟们。真要加锁的话,还用你加呀。我们来想一个问题干嘛?我们来看一下,这是Lia接口。那么绿色接口我们用idea打开一看。我们发现。这货接下来的话干嘛,他是不是有很多时限类,其中我们会明白大家学过。我们是不是有一个实现类叫VE?讲过吧,那么这个时候同学们。
17:00
不废话。I list是有问题的。那么现在。我们new vector。这个是同学们漏眼。假设vector。他的。爱的方法。回答我什么情况?VE有没有加锁?那假设你回答加锁,这种同学你还不如直接回答用VE类来解决。第二个我们来看一下,那vector到底好不好使,能不能解决这个问题。让大家。请看我说。回答我30个线程各种并发写操作了以后怎么着?没有报错吧?没有出现Java con currentent Mo吧?好,所以说用VE类可不可以解决这种问题,完全可以解决。但是兄弟们,我们得。问大家一个问题啊,这个时候就坑爹了。
18:00
我们看看VE是什么时候1.0就有的。那么这个时候我们。我们再来看看我们的list,它是什么时候哪个版本出来的。1.2。哎。啥意思啊?说明是不是阿瑞斯的诞生要比VE塔要晚啊?那么明明已经有vector了。我干嘛还用呢?而且大家可以看到vear现在是不是要表面上要比牛逼。你汇报并发修改的异常,我VE是不是根本就不会报?既然这样的话,我为什么要用阿塔,而且现在大家教的话,是不是发现很我们学过VE,但是很少再用这个了。什么概念?记着vector加了锁,加锁数据一致性绝对可以保证,但并发性急剧下降,明白。第二个I干嘛?为了杜绝这种情况,就是一种不加锁的。集合嘞。
19:00
那么这个时候它的并发性。上升。但是以牺牲。多线程的安全性为代价,那么他当时的意思就是说。线程安全用这个线程不安全,不考虑要性能的用这个,所以说他推出了这个听懂,那么接下来我们要一个问题是。既然现在大家都很少用这个了,那么我们咋整呢?第一个。我们解决方案回答我。可否OK?下面我的问题是。新面试官的原话。不许用wac卡。那么。这个时候。非常的抱歉。那么我们用什么呢?好。同学们。请看这么两个东西。
20:09
一个叫collection。一个叫S。啥意思啊?OK,要明白啊。刚才看过了list接口的接口,是不是叫collection接口,我们都明白,Collection接口同学们学过最多的是不是一个叫list接口,一个叫set接口啊?好,注意这个是叫什么接口,这个collection s,那么注意同学们,它是什么鬼类,它是集合接口的,加了一个S的辅助工具类,那么这个时候兄弟们。我们来看。干什么呢?等于集合类。List是线程不安全的,那么我对应的一种方法找到常见常用的工具类,它一定会有一种辅助的工具类来帮我从不安全的变成一个安全的听导。那么这个时候请看。
21:10
A点二。Synchronized list。那么这个时候。要。A release。来,兄弟们。这样是不是就构建构造了一个线程安全的,相当于说在不安全外面又包了一层安全啊。你这个书你怕封面。受损,我就包一个书壳,OK。那么这个时候,同学们,我们先来看。能不能解决?基本上没有报错了吧,好,那么所以说我们的第二种解决方法,那么干什么呢。就是要用这么一个东东。那么坦白讲,兄弟们,那么举一反三,你看看名字是不是也知道是不是synchize list是不是构建成一个同步的list呀?
22:04
诶。只要有list的兄弟们,那么我们再问一个问题,会不会有其他同步的东东呢?Map有没有?Set有没有?反过来讲,只要在这儿挂过号的,反推过去,我们就会明白。说明map和set也是。不安全的集合内同意不同。同意吗?所以说反推,那么为我们的后面。打听障碍。好。接下来面试官说挺不错的,干嘛?这两个都知道,那么呢。小伙子,你是我最近面试的。程,求职的程序员当中基础知识最扎实的一个,能够回答到这儿挺不错的。你们这个时候杨哥考考你们了,你们怎么跟面试经理过招?怎么回答他人家在夸你哦?
23:00
你跟他说什么?那当然对吧,哎呀,兄弟你死定了,你懂的。干嘛?这个时候要明白。捧杀比棒杀。更可恨。当项目经理在吹捧你的时候,你要小心重心霸他在后,项目经理是不是在运着气呢?准备发大招了,听懂了吧?那么这个时候你不能说,那当然你死定了,小子还没面试通过呢,就开始膨胀了是吧?干嘛醒起醒起,干嘛清醒点,加大电流,该吃药了。马上谦虚的跟项目经理讲,没有,没有经理,我只不过是什么经理呢?干嘛?引导的比较好,我走狗屎运,刚好经理问到的这个东西是我复习到或者我以前用过的,我相信要是经理您再问我深一点,再难一点,我肯定也会挂的。注意,最厉害的是不是叫以退为进了,你可别牛逼啊,听懂了吧,否则你说一句,那当然,那么这个时候你死定了。
24:05
接下来问题项目经理,当然该考的会考咱也不怕干嘛,既然选择it了。真功夫说话。最终。战场较量,实力说话。那么呢,也不要抱怨,杨哥也经常讲过这句话,帝都会没有实力的愤怒和抱怨。毫无意义。他的问题是也不需用这个。请问。其他方法你知道吗?最多给你个提示勾,UC里面提醒你,你知道吗?也就是说这个不需要。这个不需要,那么第三种方法。该是什么呢?我们下一讲再给大家进行详细的介绍。
我来说两句