00:01
行吧,那这样的话,我们线程同步这块呢,我们类似的使用场景有有有类锁,就是为了保证静态变量的安全。勒索,一看就是保证静态,静态安全。的静态变量的安全,我不是说了吗?变量变量这一块呢呀,它有什么呀,有有这个成员成员变量对吧?有实例变量和什么,实例变量和什么呀,叫做静态变量是不是?哎,我们这个实例变量的安全已经可以保证了,那静态变量的安全怎么保证啊。对吧,静态变量的安全你怎么保证呢?是不是那你就可以使用类锁来保证静态安全,静态变量的安全嘛。是不是,哎,没事啊,咱们可以举个例子,举个例子啊,各位来。呃,这样同学们啊,我给大家出一个这个面试题。行吧,大家思考一下好不好?看看这面试题啊,来,从这建个包啊,Package叫exam。
01:00
考试啊,Exam。嗯,Shift f6啊。好。呃,给大家出一个面试题啊,大家注意看一看啊。嗯,叫做exam。行吧。PSVM,注意听课啊,面试题。看大家到底学的怎么样啊,到底听明白了还是没听明白,在这里呢,有一个class叫my class,非常简单,My class里面有个方法,这个方法呢叫做do some,然后呢,还有一个方法呢,叫做do。这个do some方法呢,它这个里边有个SYNCH。在这输出啊叫do some begin,然后呢,输出一个叫do some over,然后这块呢,我们就thread.sleep。
02:04
注意看代码啊,我先写代码,你先去理解啊。1000乘以十睡眠十秒。加一个try cash,注意看啊,这上面有NCH的,但这上面没有。看见了吧,哎,然后呢,把这个代码拿过来,这叫do other begin和do other over。代码非常简单,然后这里有一个线程。这里有个线程,各位啊,叫my thread,去继承这个thread,注意听啊,那么在这个线程当中呢,它有一个方法,这个方法呢,就是run方法了,没得说重写了是不是,那这个run方法这块啊,它这它这它这有什么呀,有个my class,各位啊,有一个my class。My class MC。然后呢,有构造方法my thread,这个构造方法呢,它可以传一个my class参数过来MC啊,然后这块呢,就是this m CMC。
03:04
这点我能看懂吧?好,那么接下来我们假设有个T1线程和T2线程。假如说啊,将来在这把我们我们先把这个main方法写一写吧,下边的代码能看懂吗?一个有情况的,一个没有对不对,这是个线程里边是不是麦class,这个my class是不是它。是吧,通过构造方法是不是给他传个参数过去啊,润放里边代码还没写啊,一会儿再写,一会儿再写这个代码啊。好,我们来把这个呢,给它创建出来啊,创建出来,先把它创建出来吧。My class mc61个my class用完了,线程是这样的啊,所T又一个什么呀。你有一个这个ma right,诶你看你有个线程过来了,线程里边需要传个my class,所以把这MC才传进来,然后接下来怎么着呢,我在这创建个线程T2。看到了吧,T1线程T2线程是不是共享这个对象啊。是不是哎,共享这个MC对象啊,共享一个,然后接下来t1.setname啊,它的名字叫什么呢?叫T1,然后T2现在在name呢,它的名字叫什么呀?叫T2,我先给他起好名字。
04:07
Site name啊site name好了,那么接下来我就启动T1线程启动,然后T2线程去启动T一线T2线程中间我睡会。以保证T执行啊,我睡眠啊。这个睡眠的意思是为了保证T1先执行啊。注意这个睡眠,这个睡眠的作用是为了保证什么呀,T1线程先执行。T1先生先执行,那么执行呢,T1先生执行,那么这块啊,我做个判断,如果说呀,Thread。点currentrender get name当前线程点一名字,点S t1的话,那我就让什么呀MC去调do some方法。如果我们现在这个线程的名字啊是T2线程的话,那我就让MC去掉do other方法。
05:05
好,这个代码再捋捋一下各位啊,捋一下啊,有点占线有点长,来再捋一下,来看一下这个是不是有情况带子的。这是没有。对吧,哎,没有啊,这个没有,这个有,这里边儿先输出do some begin,然后睡眠十秒。然后接下来呢,这个睡眠的过程当中,他肯定方法没有结束对吧。方法没结束,这把锁是不是不会释放啊?对不对,好,那么这个时候T1线程启动了,启动之后呢,T1线程是不是先条件成立了,是不是先调do sum方法呀,Do sum方法会先执行。对不对,哎,然后紧接着呢,紧接着我T2线程去启动,T2线程启动呢,T2线程启动之后呢,我这个run方法执行我的T2这个线程就成立了,成立后就执行do other,现在这个面试提示这么问说do other的方法在执行的时候需不需要等待。Do some方法的结束。就这个面试题,他是这样问的啊。
06:01
就是do other方法执行的时候需要等待do some方法的结束吗?就这个do other。方法的执行需不需要等do some结束?我说过synchronized出现在这个上面。出现在实例方法上。表示所this。对不对,共享对象是不是this啊,是不是这个对象,这个对象是不是传进去给T1线程,这个对象传进去是不是给T2线程,现在这个里边的这个Z。是不是就是这个对象。对吧。
07:00
现在do some do other方法的执行需不需要等待?这个的结束就是do some的结束?只有两个同学说了吗?别的同学是怎么想的?需要还是不需要?这个do other方法在执行的时候需不需要等待do some的结束?为什么不需要说出理由?Do方法为什么不需要等待do some的结束啊?这俩方法会排队吗?因为这个位置没有S的。执行do other方法的时候,不需要获取共享对象对象锁对吧。
08:03
是不是因为这个方法是不是没有锁。不需要锁吧?哎,没有single night需要啥锁呀?不需要锁,当然这个是不是就直接就执行了。对吧。这个答案是不需要。不需要,因为do other方法。没有synchronized。啊,没有S的。是吧,走一个看看直行。我们先来看do some begin输出了。大家看do是不是马上begin,然后over。这个do some是不是还在执行,它并没有结束,十秒钟之后它是不是才会结束,你看。Some,结束了吧。对不对,所以说这个程序呢,大家要理解。
09:02
理解什么呢?你再看do some开始执行,把这把锁占住了,但是do other会马上执行,为什么?因为do other不需要这把锁,因为do other方法上没有S。看见没?对吧,哎,等你都,嗯,这个这个不需要排队,你看没有排队,并没有排队。是不是哎,没有排队啊。
我来说两句