00:00
那各位同学我们呢,继续。那么上一讲给大家从代码理论和各方面而言。说过了。我们的。可见性。那么这个时候。再来看。各个线程对主内存中共享变量的操作都是在各自线程各自的拷贝到自己的工作内存中进行的,然后干嘛写回主内存,刚才是不是说过了?好。那么这个时候。怎么着呢?一个线程AAA就是刚才我们的A线程,三秒钟以后修改了共享变量number。是不是将它从零变为了60啊?但是还没有写回主内存的时候,另外一个线程PPT也对主内存中的一个共享变量。X进行了操作,那么此时A线程的工作内存对共享变量X对线程B来说并不可见。OK,那么这块呢,说管说说1000道1万,就是这个模型,再说白点,那么各位同学。
01:04
干嘛?现在主内存是杨哥,今天我们上课结束以后,我现在是不是要把视频发给大家,这个就是主内存中的原件。好,现在有三位同学来修,来拷贝我的视频,你们懂的,这个时候是不是从主物内存里面,你们从杨哥手上这个源头拷贝出去的。视频绝对是版本是一样的,对吧,好,那么假设现在。刘欢同学是T1这个线程,他在杨哥的基础上觉得可能用这样的方法写的效果会比杨哥。更好。他就在自己的。笔记本上面,你拷回去以后是不是在各自县城各自的工作空间?也就叫工作内存线程工作内存。他把这个视频呢修改的更好。把这个case呢编排的更顺滑,然后第二天早上。
02:03
他来告诉杨哥。你看杨哥,昨天我从你这儿拷贝在我自己的工作内存里面,我觉得吸收了你的经验。我。把它优化了一个版本。那么现在您来看一眼,那么重要发现干嘛呢?刘欢同学,现在对我的程序的修改确实比我昨天讲的更好,那么这个时候我会怎么说来各位同学?现在刘欢同学又把我的case进行了一定的升华和提升,那么我给大家进行一下分享和讲解,那跟我讲这个时候干嘛通过主内存杨哥去通知其他线程,其他线程也收到了更好的效果,这个是不是就叫可见性及时通知啊?同学们O吧。好。那么它对于。我们到。可见性,那么呢,杨哥呢,就给大家介绍到这儿。
03:01
那么第二个我们来看一下原子性,注意。G mm Java内存模型要求保证原子线。但是完了,太阳为什么说它是轻量级,轻量级数就是低配。说白了,轻量级的同步机制啊,你要是听不明白,你就把它听成什么,就是乞丐版的SYNCH讲完了。好,完了,太阳它是不保证原子性的。怎么来,兄弟们?二话不说。先算代码,再说理论。兄弟们,跟我来。现在这个case我们已经完活,我们干嘛呢?将其代码提出来,那么这个就是什么呢?C?OK,能不能BY?Vallatile,言下之意,是不是vallatile可以保证干嘛?可见性,OK,好。
04:00
那么接下来。我们呢,这个case还是给大家呢写好注释,那么来干嘛呢?可以保证可见性。及时通知。其他。线程主五里。内存的值。已经被修改。OK。这一步没问题吧,那么。什么叫?原子性呢?这一步我们要得明白。那么。干嘛呢,这块1.2还是给大家补一下小笔记,那么这个时候。添加了verile。可以。解决可见性问题,同学们没问题吧?第二,验证。
05:05
我。不保证什么呢?原子性。好,首先我们就要明白。一个问题。原子性质的。是什么意思啊?给大家十秒钟思考一下,我暂停一下录屏。那么刚才呢,同学们呢?课堂上讨论了一下,那么听我来说,那么就是什么呢?这个原子啊,当我们买SQL数据库事物的那个原子。有点差不多,但不是化学物理上那个原子啊,什么原子分子电子质子粒子什么的,咱不扯那个事儿,你别的那什么化学小少年是吧,这事呢,晕了。注意,言下之意就是什么?不可分割。那么言下之意就是什么?
06:00
完整性。也即。某个。县城正在做。某个具体业务。十号。中间不可以被。加三。或者被分割。需要整体完整。要么同时成功,要么同时失败。好,言下之意啊,这个原子性。其实说白了,原子性就是保证数据的完整一致性。那么各位同学,假设现在有一个同学他来班上,他要写他的名字签到,这位同学叫张三。他拿了这张,这支笔。弯弓张这个信写完以后,突然有人给他抢了,那个是个李四,李四就去写,李四再写完,再给张三,张三再填完这个三,你跟我讲张三是不是很不爽?
07:08
正常大家到课堂上签名答到的时候是不是要你的名字写完以后,完完整整的写完了以后再交给下一个同学。尤其像你们班。这位同学有四个名字啊,四个字组成一个名字啊,那你被打断四次,我四次,我估计你也崩溃了,一般而言,是不是应该保证原子性,也就是完整性,这一时间段干嘛只允许一个人来操作?再说白点,什么叫完整性就是。我的操作不要被你的操作覆盖了,否则我们两个不OK。那么接下来请看。我要看是否可以。保证。原子性,那么这已经说过了,干嘛,What?不保证原子性。的案例演示。兄弟们,开工。
08:00
Public。那么干嘛呢?Void。看好。二。Plus。言下之意,你懂的,是不是就是我们传说中的number加加?兄弟们,没问题吧?注意此时是加了的。OK,那么好。写一下吧,还是每一步都给大家认真的记。请注意,此时number前面是加了。关键字修饰的。那么呢?不保证原子性,再次强调何以见得呢?兄弟们。现在咱们这么干。我们呢?有20个县产。来。资源类my date这个类里面的A加加方法。
09:02
每一个线程。做100次。那沿下吃线。20。乘100。这个答案不用我告诉大家吧,那当然你可以更多一点干嘛,比方说20个线程,我干他1000次。这个值是不是刚好就是2万。那么好,沿下直线,那初始值是零。每个线程点一下加个一,我们最终答案是不是应该,如果原子性正确的话,兄弟们该不该是应该是就是,答案就是2万。好,那么接下来请看。老规矩,线程操纵资源类。My date my date等于六,My date好。干脆我多一点。20个线程,每个线程点1000次,所谓的点就是点这个这个值啊,点一下是不是加一次啊。第一个线程点1000,第二个线程点1000,那正常情况下20个1000相加是不是刚好就是2万。那么也就是说,最终。
10:09
所有线程,这也就是所有,就是20个线程都计算完成,每线程来取得。就应该直是2万同一否。好,兄弟们请看。现在20个线程。现在。20个线程,同学们,这一步是idea的快捷键,那么已经教大家设过OK。我默认是十个,你现在需要几个就是几个,没问题吧,那么再看一遍,还有同学说,注意,正常情况下我是不是要这么写。干嘛?现在是不是要写一个多少22,然后我这儿是不是要20个线程。然后呢,要THAD02,这个也是我的快捷键,那么在这一块我们由于这个线程名字是不是可以string。
11:07
点value of I,那么这一步没问题吧?那么由于这样的模板是多线程编程里面经常用的,你负几个线,几个new s是不是就代表新产生几个线程?我们现在的诉求是20个线程,那么所以说干嘛呢?Thread。这是我。自己的快捷键。FOUR12的十代表我默认生成十个线程,那么现在你看这个套路模板是一口气出来了,那么请同学们呢?之前我们也讲过idea idea的模板化编程必须要学会啊,你这样工作才快。这样的话呢,干嘛?最终你是不是才可以钱多事少离家近,别人加班你加薪啊?OK,抬高。20个线程干嘛,每个线程那对它加1000次啊。那么来。小于等于。
12:01
1000。这个时候就是一干嘛呢,老规矩,现在是不是一到20号线程。这一步,同学们没问题吧?这个是我第二个参数,就是那个STEM,那个线程名,线程操纵资源类,资源类就叫MY。第二,ADD plus plus。是不是爱的加加?没问题吧,同学们都20乘以1000吗?这答案不用我给你吧,对不对?但是呢?那么第一招。我是不是得他等等他算完看最终结果。其实原子性就是代表最终一致性能不能保证。中间我在做的时候,别人不要来加塞,不要把我的操作被砍成了两段。那么这个时候干嘛呢?我们。需要等待上面。20个线程都全部。计算完成后。
13:00
再用。内线程取得。最终的结果值。碳是多少?就说白了,现在如果正确,最终结果值同学们应该是多少?2万没问题吧,那么接下来。怎么叫等待呢?那么第一种。二话不说。给他五秒钟啊,五秒钟这点计算。20乘以1000怎么也算的完了吧,对不对。那请问你怎么知道是五秒钟?乱写啊。那么这时候这种方法可不可以,可以,因为我们自己算了,我也知道五秒钟它100%。算的完了,但是也许人家的时间可能只是需要1.34秒呢。我们最爽的一个情况是不是应该是只要全部计算完,我们就取得。就是十用多少时间对吧,那么这个时候我们干嘛呢。
14:03
Well。Thread。Active count。大于二的话。说明线程还没有算完,那么这时候干嘛呢?我们要点。要的这个时候是什么?等待上面20个线程全部计算完。他用五秒就是五秒,他用了3.84秒就是3.84秒,那么言下之意,这个就是多线程控制上面的计算时间的一个最好的方法,当然我们是以main线程,为什么大于二呢?因为默认啊,后台有两个线程。一是没线程,二是后台GC线程大于二,那么我现在是多少?那这块有20个线程,那说明什么?只要是大于二,说明还没有线程,干嘛马上压的,压的是礼让线程,就是我退我不执行,那么他一不执行交出去,其他的现场会更好的计算,那么这时候算完了以后是多少就是多少。
15:02
好,我们C2套,那么这块呢,我们在严格的GUUC那门课上呢,都讲过,那么不多废话。好,那么这个时候。My current快捷键能不能OK?过来干嘛呢?那么这个时候就是我们的什么?现在finally。Number value是多少?那兄弟们请看此时。这个线程。只要是Y大于二亚的,这个线程会被暂停,会被干掉,内线程相当于下不来,这么说听不听懂,也就是说内线程也就在上面,要等着这20个线程全部算完了,马上轮到内线程,你什么时候算完,第一时间通知我,我来获得,这样的话呢?我们是不是不用乱设什么五秒钟,50秒,七八秒钟听懂,也就是说这个。很重要,那么过来,那么这一步就是内线程。最终的值我们干嘛呢?Y对点那么好,那么言下之意。
16:04
整个思路同学们能跟上。20乘以1000是不是2万?如果说加了。Lat关键词修饰number能够保证原子性的话,请问那这货这个值第58行是不是应该打出来是2万?那么这个时候。那么我们来看一眼它是多少呢?那么首先我在运行之前,我先问大家一嘴,有没有可能58行打出来刚好是2万。好,这种可能是存在。但是不妨我们。看他一眼。191。六二。我再跑一眼,没星辰打出来是18864。我再跑他一步。没形成打出来是19798。好,最后一次。丢的更多。那么言下之意,出现一种什么情况?是不是发现我们最终的计算结果根本就不对呀?
17:05
那么这是为什么呢?好,那么同学们。请看这个就是我们的volatile。首先。这个知识点还是先给大家录一集,这个就是volatile,不保证原子性。我们是不是代码证明过了。下一节我们说原理。
我来说两句