00:01
关于c net关键字,它锁定的是哪是呃,到底是哪一个资源这块啊,我们需要再说一下。呃,因为我们知道C高带的这个关键字呢,我们使用它呢,是用来完成这个线程同步的,对不对,完成线程同步的,也就是说呢,如果说当我们多个线程呢,去呃,同时去争夺同一个资源的时候,我们这个时候就需要。加一个线程同步,让线程呢去排队去呃完成操作,否则的话会出现这样一个数据错乱一个情况,对不对,所以呢,我们使用它呢,是为了完成,不是要实现线程同步。首先线同步表示啥意思呢?就是让多个线程。对吧,排队。依次获取。获取某个资源对不对,然后保证这个数据啊不会出错。对吧,他他是干这个事情的,但是呢,我们关键要搞清楚这个C康它到底锁定的是哪一个对象,锁定不一定是对象,就CNE。
01:08
到底锁定的。是什么?元素。对吧,我们得把这个问题搞清楚,因为像类似于这一块的这个面试题的话,它更多的时候就考察的是这个东西,它到底是怎么锁的,怎么去实现线上同步的,对吧?比如说我现在给你出一大段代码啊,出一段的代码,然后让你告诉我这段代码它的结果是啥。对不对,那像这些东西读代码的题,那是不是你首先要搞清楚这个东西到底是。到底锁定的什么元素,你把这个本质的问题搞清楚之后呢,无论说它怎么变,咱们是不是都可以解决这个问题了。对不对,那么这个CNE到底锁定的什么元素,我们得分几种情况来看啊,就来看这个CNE,呃,它到底是加到哪了,因为我们说这个C2种使用方式,第一种呢,是不是用来修饰方法的。
02:00
对吧,第二种是不是直接修饰代码块。对不对,我们得分情况来说啊,因为不同的方式它锁定的元素是不一样的,那么首先来看这个修饰方法的C加到方法这块,我们到底是怎么去锁定的,那这边的话呢,我们又得分为什么呢?静态方法和非静态方法吧,对吧,我把这个给你。列出来啊,这边我们又可以分为静态方法。和非静态方法。对不对?方法是不是又可以分为这两种,那么C作用于不同的方法,它锁定的元素是不一样的。对不对,那么首先我们来看啊,如果说它是非静态方法的话呢,它锁定的是谁呢?它锁定的就是当前的方法的调用者。他锁定的。是。方法的调用者。别说谁掉地方,我数谁。对不对,那我们通过例子来看啊,这些东西最好是通过例子来看啊,来我这边写一个data。
03:02
好,我在里边的话,我们来写两个方法。非静态的方法啊。比如叫FUNCTION1。再来一个。方式二。对吧,来两个,然后的话呢,我这边要干嘛呢?我这个方程一里边呢,我比如说输出个一。对吧,这边我输出个二。对吧,哎。两个方法,然后呢,分别输出一和二好,那这边输出一的时候呢,我要干嘛呢,我不能直接输出啊,我是不是先让它休眠一下。比如我休眠啊,三秒钟。休眠三秒钟之后,再把这个一输出。对不对,那这个二的话呢,是直接输出。对不对,二就是直接输出好,那现在的话呢,我们这边我们来创建两个线程,然后来访问我们这个data塔这个资源,那首先你把data创建出来。
04:01
对吧,然后开启一个子线程啊,比如说线程A。好,启动,然后访问data,是不是你有一个thread.start。然后这边我们用拉姆达表达式去实现它,然后把名字传进来,这是A线程。哎,这少了一个这个。对不对,然后在这里边的话,我干嘛呢,是不是掉得塔点方程一。这是A线程嘛,然后再来启动一个线程B。又一个thread。Start。线中B在这儿的话,我们要得塔点方程二。对不对,是不是这样这样一个操作对吧,那么我们现在如果直接来运行的话,你看结果。你会发现这个时候是不是先输出二,再输出一啊。
05:00
对吧,这为什么呢?因为这两个线程是不是同时在启动的同时启动之后,等于这两个,这两个方法是不是同时同时在执行,对不对?好,假设你先执行一,但是这时候它是不是会休眠三秒,所以说这个一是不是三秒钟之后才会输了,但是我这个二是不是立马就输出了。对不对啊,那包括你看我们就在这儿呢,在中间给它加一个,比如说我在这儿让它,诶我把一启动之后呢,一秒钟之后我再启动二。对不对,我把一启动之后呢,这边休眠。一秒钟。对吧,休眠一秒钟啊,休眠一秒。休眠一秒之后,我再来启动二,所以说这时候我们来看结果他应该什么样。是不是不这个二不会先输出,是不是隔了一秒钟之后输出二,然后再隔两秒钟之后再输出一。对不对啊,所以说首先要把这个。想清楚啊,看我们这个方式一的话呢,它是三秒钟之后,它会把这个一输出,然后这个方式二是直接把二输出。
06:04
然后我是先启动它的。对吧,那这时候它是不是隔了三秒钟之后之之后这个一就出来了,然后启动完它之后呢,我是不是隔了一秒钟我来启动这个二,这个二是不是立马就输出了。所以说我们的程序呢,就是启动之后一秒钟之后,我把二输出了,然后再隔两秒钟是我再输出一。对不对,就这么一个关系啊好,那当然我们现在是没有加任何的CNE啊,现在我们就给它加CNE,我们来看一下,如果说我们加上这个线程同步之后,它就变成什么样了,好。那么我们现在给大家C。给大家SCHN。给这两个方法都加上了C,这个时候我们这个线程就会有线程同步,也就是说多个线程就会争夺这个资源。对,那关键是争夺是哪个资源呢?或者说这个非康奈锁的到底是谁呢?这边我给你写出来了,如果者说非静态方法的话呢,它锁定的就是方法的调用者。啊,方的方法调用者就是你这个线程A,现在想执行我们这个方案,方式一的话,他必须拿到一个资源,或者要锁定一个资源。
07:08
那包括这个线程B也是一样的,你要执行这个方程二,它也需要去锁定一个资源,那它俩锁定谁是哪个资源呢?因为我们这个方根是不是都是非静态的方法,所以说锁的都是当前方法的调用者,那方法调用者是谁呢?是不是得塔?是不是同一个data?对不对,他俩锁的是同一个东西,所以这个时候就会出现形成同步吧。对,这时候一定会出现限制同步的啊,因为我现在只有一个data塔,然后你A和B要执行的话呢,是不是都得去获取它。对不对,那很显然是,是不是A肯定先拿到它了,对不对,AA我先启动的A嘛,A先拿到它之后。A先拿到它之后呢,这时候B呢,是不是也就启动了,隔了一秒钟之后,B也启动了,但是呢,这时候B启动之后,理论上来讲,B是不是应该立马把那个二输出啊。但是这时候他不会立马输出二的,为什么呢?因为这时候他要输出二的话,他首先得拿到这个资源,但是这个资源是不是被A拿着呢。
08:03
所以他拿不到嘛,所以他只能排队吧。对不对,排到什么时候,排到这个A执行完毕之后,所以说我们看到结果就是程序启动之后,三秒钟之后,这个一会输出的,然后一一输出,是不是资源释放,B拿到之后是不是立马把二输出,所以说我们看到结果就三秒钟之后,一二同时输出。对吧,程序启动三秒钟之后,一二同时输出,我们来验证一下是不是这样的走。啊,三秒钟之后,注意。是不是同时输出。对不对,所以这样的话呢,哎,我们就实现了这样一个同步,所以说对于非静态方法锁定的是方法的调用者,那你比如说我再换一个啊。我把这个C呢给他去一个。区隔之后我们来看结果是啥,还会不会是三秒钟之后一二同时输出,还是说先输出二,再输入一啊,他俩各自走各自的。你看是不是这个时候先输出二,再输出一。
09:00
这个时候又说明什么呢?是不是他俩自己走自己的,你走你的,我走我的事也不影响,因为只有说我等你的话呢,是不是才会出现,哎,一输出之后再输出二。对不吧,那这时候他俩为啥会各走各走呢?就是因为没有去争夺资源嘛,没有去排队嘛,为啥没有排队呢?因为我现在是不是需要给这个方一加了,所以说方一在执行的时候是不是需要锁定一个对象。锁定一个资源对不对,但是我这个方式二是不是没有加形式同步这个关键字,所以说方程二执行的时候不需要去锁定任何资源,所以它立马就能执行嘛。对不对,所以说你看这样去写的话呢,是不是等于还是一个data啊,然后A执行需要锁定它,OK,那你就A把它拿着嘛,拿着之后呢,A是不是开始走自己东西,三秒钟之后输出一,然后隔了一秒钟之后我们再来启动B,但是B这会调离方式二,它是不需要去获取任何资源的,所以说跟这没有关系,我是不是走我的。就OK了,我一秒钟之后,哎,我是不是立马输出了二,所以说我们看到结果呢,就是程序启动之后,一秒钟之后输出二,然后再隔两秒是不是输出一。
10:05
对不对,因为他俩不需要争夺资源。对吧,所以说你去看这个C啊,最核心的就是看这个CNE。它到底锁定是哪一个资源,我们线程要争夺是哪一个资源,然后这个资源到底是一个还是多个,如果说是一个,那么多个线程肯定要排队,如果说多多个,每个县城都能拿到一个,那就不用排队。对不对啊,然后你不包括这边我们再换回来好。那你现在的话,他俩肯定要排队,他俩排队的话就是先完成一,然后再完成二,所以说看到结果呢,是一输出,然后之后再输出二,对吧。那么如果我再改一下代码。我来创建两个对塔。好,然后我这边的话呢,FUNCTION1啊,我用的是一。方式二,我用的DATA2,这个时候他们会不会同步,或者会不会排队?
11:02
这个时候不会排队啊,我们来看一下是不是不会排队。啊,各走各的。对不对,二线输出再输一吧,因为这时候他们他俩不会影响啊,这是为什么呢?因为现在还是说AB2个线程。然后A要执行的话呢,他需要拿到一个资源,对不对,他需要拿到哪个资源呢?就是谁调这个方式,他他需要拿到拿到这个资源,那那我们现在用得塔一去调的,所以说A是不是把data塔一拿到了。对不对,然后隔了一秒钟之后啊,我们这个B就启动了,B启动的时候也是需要去锁定一个资源的,因为方式二它也有C框带的修饰,那这个时候方式二的调用必须要获取哪个资源呢?是不是谁调方式二对塔二去调的,所以说这是另外一个对象,所以说他拿它,你看是不是两个人每个人都能拿到一个资源,所以就不存在排队嘛。就相当于两个人上厕所一样,对不对?如果说只有一个厕所,但是现在有两个人,那是不是必须得排队,但是如果说有两个厕所,那你说用得着排队吗?那不用嘛,一人一个是不是同时进行啊?
12:05
就不用排队吗?对不对啊,所以说这是。我们如果说C带修饰的是非静态方法的话,我们就。呃,确定它锁定的就是方法的调用者有那个对象好,所以说你接下来去判断这个代码的时候,你只需要去判断一下当前这个对象到底是一个还是多个,然后这些线程,进而分析出这个线程要不要去等待,进而就能推断推断出这个结果了。对吧,但是如果对于我们这个非静态方法啊,对于我们的静态方法的话,我们锁定的是类啊,而不是方法调用者了,锁定的是类,这时候就完全不同了。比如说我们把这两个改成非静,改成这个静态的static。好在你了好。是吧,我们把这改掉,然后上面这边不动对吧,还是两个资源,一个DATA1,一个DATA2,然后一人一人拿一个对不对,那这时候我们来看一下他俩会不会排队呢。
13:00
这时候会排队的啊,来看一下会不会排队,排队的话呢,就是一秒三秒钟之后呢,同时输一和二。对吧,他俩会排队的啊,为什么呢?因为我们现在锁定的东西已经不一样了。对吧,锁定东西不一样了,我们说如果说是静态方法的话,锁定的是类,也就是说现在A和B要执行这个方法,他们要锁定的东西呢,是data塔这个类,而不是对象了,哎,所以说也就是你现在即使有个一有个二得塔1DATA塔二好有个A有个B对不对,那你这边A启动起来之后呢,A要执行这个方程一,我需要锁的是这个类啊得塔类是不是只有一个。对吧,你虽然有两个对象,但是类只有一个,所以说A锁的是它好,A锁它之后呢,一秒钟之后我把B启动起了,B要执行方式二,它也需要去锁定这个得塔,这个类,但是这个类只有一个,是不是被A拿走了,就等于只有一个厕所,现在A进去了,你说B能进去了,B进不去,只能等A方便完之后出来,他才是才能进去,所以说这时候B是不是要等待A执行完成之后,它才能执行。
14:03
所以呢,我们看到结果只有三秒钟之后,这个一输出了,然后紧接着二输出了。对吧,哎,就是这样的操作啊。好,那如果说你看我们再变,所以这个这边这边的变化有很多啊,但是你只要把它核心点抓住,万变不离其宗,对吧,怎么写你都是没问题的啊。干,如果说我们把这个呃,方式二的这个C钢带去掉之后呢,它俩就不会排队了。看看是不是。对吧,就不会排队了啊,为啥还是看锁定的东西嘛。啊,还是看锁定东西,因为现在的话呢,我们还是啊。AA需要去锁定东西,A锁定谁呢?A锁定是贝塔这个类。可以没问题,他一上来之后肯定锁定,然后他开始等待三秒,然后数一对吧,然后这时候B启动之后呢,B这时候没有加C,奈不用去锁定任何东西,我是不是直接执行就可以了,所以等于两个同时执行嘛。对不对,就等于现在还是AB2个人,然后这边还是有一个厕所。
15:04
但是这个时候A上厕所的话,他必须得到厕所里边去方便才行,但是B这个时候就比较随意了,对吧,哪怕我没有厕所,我是不是也可以解决我的问题。对不对,就相当于这样的,就我不需要依赖于你某一个资源我才执行嘛,对吧,没有这个资源我也能执行,所以说即使有一个我也不会给你争夺嘛。对不对啊,所以说看的还是这个东西啊。就这样操作,所以呢,对于我们这个static的话呢,它锁的就是类。锁定就是类,然后呢,非静态方法锁的就是方法的调用者,就是那个对象,所以说把这个把这个记住,把这个记住,无论说这个题怎么变,对吧,我们都可以搞定它啊。好,然后接下来第二类就是我们来修饰代码块。我们使用这个c net来修饰代码块,那修饰代码块的话呢。我们这边锁定的是谁呢?锁定的是。这个传入的这个对象。
16:01
锁定是传入的对象啊,因为代码块的话呢,是不是这样去写的。嗯,我们再来写一个。我再我再来写一个东西,再来写另外一个类。比如说我叫DATA2吧。在DATA2里边的话,我们写一个方法。Function。这里边儿的话呢。我们这样去写start。然后呢,执行完毕之后,我们来输出一个N。这中间呢,我们来休眠一下。比如我休眠个一秒钟吧,好。所以等于我们调这个。咱们现在如果说调这个贝塔二的方程的话呢,哎,它会先去start嘛,然后隔了一秒钟之后,是不是N就表示我们一个方法的一个运行嘛,对不对,好。
17:02
然后我们来使用它来看一下,先来看一下这个它应该是一个什么样的一个效果,重新写个方法。这边的话我们写一个啊,我先把这个DATA2给它创建出来。然后这边我们来写一个循环。写个循环。刷五次。循环体内部的话,我们来创建对象。对吧,然后我们来叫贝塔二的这个方式方法,你看一下得塔二点方程。对不对,那么我们现在来看一个是是一个什么结果啊走。一个。它是同时输出五个start,然后隔了一秒钟之后,是不是同时输出五个N的。对不对。这个要理解一下啊,什么意思呢,就等于我们现在是不是启动了五个线程。
18:02
启动了五个线程,然后每个线程是不是都在调这个方式方法,然后方程方法一进来之后,是不是首先输出start。因为这五个项是同时启动的,所以说是不是五个star一起输出啊。对不对,所以你看到五个star的一起输出,然后输出完之后呢,我是不是要等待一秒钟,等待一秒钟之后,我是不是在输出这个N的,所以因为他们是同时启动,所以说是不是同时等待一秒啊,同时等待一秒,然后把这个摁输出,所以呢,我们看到结果是五个start先输出,然后一秒钟之后输出五个。对吧,就这样一个操作啊,好,所以先把这块把这个东西想清楚,想清楚之后的话,我们再来加这个,呃,CN代码块。把它包裹起来。那这边这个代码块的话,我们就需要传入,因为这边你必须锁一个资源嘛。对不对,就像我们之前说那个修饰方法的话呢,C net它必须得锁定一个资源啊,然后如果说是非静态的话呢,就谁掉这个方法我就锁谁,如果说静态的话,我就锁类,那这边的话你没有去修饰方法,那是不是就得自己传一个进来。
19:07
对不对,我们得得传一个东西进来啊好。这边的话呢,可以传一个对象,那比如说我们现在传个什么呢?哎,我们传个Z可以吧。对不对,我们传一个this可以吧,然后传传进来this之后的话呢,这个时候它就会去争夺这个资源了,如果说你这个代码里面没有体现出CNE的话,它就不会有这个争夺资源,也就没有县城同步,也就是说县城不会排队啊,就自己走自己的。但只要咱们一旦加这个C,它就有可能会排队。对不对,就等于没有c nice,就等于我们大家去就不用去争夺这个。公共厕所,但是一旦有这个C,就是说必不能随意大小便,对吧,你要上厕所必须去去到厕所里边才可以,必须要争夺资源啊,那么现在我们如果说是锁定的是this的话。对不对,那我们来看这个结果应该是什么样的,它能不能同步呢?或者说这五个到底是一起输出,然后一起结束,还是说一个一个输出一个结束,一个输出一个结束,这样排队去走的啊,你看。
20:10
你看这个时候咱们是明显在排队了。对不对,是不是一个开始结束,然后第二个开始结束,第三个开始结束,第四个,第五个,以此类推,很明显这时候就排队了,如果说五个star同时输出,然后一秒钟之后五个N秒同时输出,是不是就说明他们在同时开始,但如果说交替输出的话,是不是肯定在排队?那么这个时候为什么是排队呢?那就看这个this到底是啥,我们说this指的是不是当前的对象呀。对吧,也就是说你现在这个this指的就是当前这个DATA2的实例化对象,也就是说你现现在这个线程要运行这个代码的话,你就必须把当前这个DATA2对象给他拿到才可以。但是你回到我们这边这个代码。你看我们现在是不是开启了五个线程。咱们是不是开启了五个线程,然后也就是说这五个线程,每个线程在执行的时候是不是都得去锁定当前DATA2的实例化对象。
21:08
他才有可能去执行,就相当于我们现在排队上厕所,你是不是必须进到厕所里边之后,你才能去上厕所呀。对不对,但是你看我们现在对塔二对象有几个呀。是不是只有一个,因为我把它写到外面了。也就是说这时候是不是五个线程。但是只有一个资源。对不对,然后你线上一线进来之后,你是不是把它拿到了,拿到之后呢,这四个是不是就得排队啊。是不是等你start结束之后,它释放资源,是不是第二个进去,然后start,以此类推,第三个进去start start明白吧。是不是就相当于五个人排队,但是现在只有一个厕所吧?对不对,所以肯定是要排队的啊,那如果说我们修改一下,哎,我把这个东西给它扔到循环里边,这个时候是不是同时开始同时结束。因为我现在是五个人五个厕所吧。对不对,就同时start同时。
22:01
对吧。所以说啊看,如果说我们用的是this锁的就是当前的这个对象。然后你就需要判断这个对象有几个。对吧,那如果再换一个。对二。叫class,哎,我锁这个类,锁这个类的运行实类。这时候大家想想。我们。还能同时开始同时结束吗?或者说他还是要排队呢?这个时候。是不是肯定要排队?为啥你就想这个锁的这个东西到底是多个还是一个,对不对,刚才我们锁的是对象,那对象一定是多个,但是我现在锁的是类类是不是只有一个呀。这不相当于五个人一个厕所,那肯定是排队去上厕所嘛。对吧,所以如果说你这边锁的是这个贝塔2.class,那无论说你把这个对象创建多少个,哎,他都要排队,因为我现在锁的就不是对象了,我锁的是类嘛。明白吧,啊,就是这么一个关系。
23:06
那你再比如,再比如我们再改。我这边呢,给他定一个。In number等于比等于一,好,我把这个number锁一下。我把这个number锁起来,那这个时候我们应该排队还是不排队?我们来看结果,这个时候还得排队啊。你看是不是还得排队?为啥呢?因为你就看这个number有几个嘛。我现在这个是不是只有一个呀。对不对,我这个只有一个,那么这个时候是不是肯定是。需要去排队的。对不对啊,那如果说我再改一下啊。我再改,我把它改成参数,让它传进来。我们在调这个方程二的时候传进来。
24:04
等于等于一,我就把这个number传进来,我把它传进来。你看这个时候是几个啊来。这时候会不会排队呢?还是会排队的。对吧,那排队就证明我们说这个number它只有一份。对不对,哎,也就是说啥意思呢?就是我们我们现在是不是五个线程。五个,然后每个里边是不是都有一个。都有个number,都有个number,都有number,然后我在调的时候,是不是都把这个number传到我们的方法里边了,这时候他就得判断这个这些这五个number到底是不是一个嘛,如果说是一个的话,是不是他们要排队,如果不是一个是不是就不用排队。其实这个就相当于现在厕所就变成这个number了啊,你只需要判断number的个数就可以了。然后我们这种写法的话呢,这个number都是同一个number,但是如果说我们换种写法,比如说我用它的这个构造器,当然这个构造器不推荐我们去用了啊,但我们可以用一下,如果说我现在扭出来的。
25:04
它这个数我们来看一下。看他就不会排队。为啥呢?因为你扭出来这个对象啊,虽然说它的值都是一,但是他在内存里边是五份。因为我们说new出来这个东西是不是在堆内存当中,只要你new一个,我是不是就创建一个,相当于你这个循环走了五次,是不是创建了五个number。然后五个number里边的值都是一,但是它是五个不同的对象吧。对不对,现在是不是相当于123455个线程,是不是一人一个。一人一个是不是相当于五个人,一人一个厕所,那么你说他是会会排队吗?肯定不会啊,是不是同时开始同时结束啊?对不对,好,那为什么我们直接写成一的话呢,它就是一个,因为这边我们用到的是这个,呃,包装类的常量池嘛,对不对,如果说你直接这个就跟我们字符串常量值很类似啊。就如果是你这样去写spring s tr等于,比如等于hello,那这时候它用的是字数段常量池里边的这这个对象,如果说你扭一个。
26:04
String虽然从结果来看一样,但是这个时候它用的是堆内存的,它的内存结构不一样。对不对,内存结构是不一样的啊,所以说这个时候如果说直接赋值的话呢,还是123455个线程,哎,它里边每一个每一个线程里边都拿到一个number,这个number的值是一,比如说嗯嗯。嗯,对吧,Number啊,但是因为你是直接赋值的,所以说我我是从常量池里边把这个一拿出来给你给你给你给你给你是不是等于你们五个,他这个number还是同一个呀,是不是还是相当于五个人在争夺一个厕所。所以肯定还是会排队的。对吧,肯定还是会排队的啊看。但是。我们这个常量池啊,它有一个范围,它的范围呢,是负的128到正的128。之间。127之间啊,负的128到正的127之间,就是如果说你是直接负值,这个值是这个范围以内的整数,那么它就会用常量值,如果说超过这个范围,是不是依然是创建出来的,对吧?比如我们来试一下啊,改成128。
27:14
你看哎,是不是这时候就已经不同步了,不同步就说明它是多个对象嘛,对吧,看127。这个时候他刚好是那个边界,所以说这个时候还是同一个对象。对不对,包括负的也是一样的啊,我们来测一下看负的129。这时候它也是五个,因为已经超过这个范围了,所以说我就不再使用常量池了,而是给你有一个。对不对,好。负的128来试一下。啊,所以说这个就是它的边界啊,这是下边界,这个上边界对吧。所以说我们就知道。这个东西还是看这个number啊,它到底是一个还是多个,所以说这个C康就是看你当前所这个东西,它是一个还是多个,如果说一个的话,那多个县城肯定要争夺,他们要排队,如果说多个,那县城就不用排队。
28:13
啊,就这么一个操作啊。那类似于像这种题的话,还有一些呃,别的一些写法,比如说我们再写一个啊。我们再换种写法啊,比如我这边来一个,我就在这个方法里边定义一个,比如说叫A等于或叫NUMBER1等于一。对吧,那这是我们所NUMBER1。他肯定会同步的,对不对,那比如说我再换一个。二等于一好,我这边锁NUMBER2,但是呢,我有一个操作,我在这呢,每次给大加一下。
29:03
看这个时候我们是不是还是同步的。对不对。这个时候我们还是同步的啊,因为我们说这边用的是不是还是我们这个长长史里边的东西。对不对啊,所以说像类似于这种题的话呢,它其实有很多种的变化方式,包括你看比如说我们在这儿啊,比如说他在这儿给你再传一个参数进来,传一个参数进来之后,这边再锁定。这边再锁定,然后去判断它的一个结果。所以说它的就是这种题型啊,它是有很多种的题型,它的变化是非常多的啊,但是呢,我们怎么去处理这些题呢?就是你抓住它的一个核心点。你把它的核心点抓住就可以了,就是这句话。就是C到底锁定的什么元素,然后根据不同的场景,我们锁定的东西是不一样的,所以说你只需要分析出来这个C它到底锁的是哪一个对象,然后或者元素,或者什么什么各种东西啊。
30:00
啊,然后判断锁定这个元素,它到底是一个还是多个,如果说是一个的话呢,那就会同步,如果说多个就不会同步。对不对,所以说把这个关键点抓住,我们这个C高带子锁定哪一个元素的这个题呢,咱们就肯定没有问题了。
我来说两句