00:00
好了,那么接下来我再演变一下各位啊,假如说我在这个类当中啊,我有一个什么呀,有一个对象。啊,这个对象是object obj new一个object,好,各位告诉我,那我把这个OBBJ给它放到这个位置上行不行。就现在我不用它了。我用synchronized,然后这边用OJ行吗?各位思考一下。思考一下啊,OBJ可以吗?就这放一个OBJ行吗?大家看清楚啊,这是是什么变量。这是个什么变量?各位告诉我是个实例变量对吧?变成单核了,啥意思啊?实例变量吧,这个对象只只有几个,一个吧,所以这个实例变量也只有几个。
01:03
一个吧。应该不行,不可以。不行。那为啥不行啊?你咋了?我问大家问题,这是一个吗?This指的是当前对象,对吗?那你这个对象只有一个的话,那你这个OBJ是不是也只有一个呀。因为这是个实例变量啊。实力只有一个呀。多线程共享共享不共享这个obj啊。啊。OJ实例变量啊。是多线程共享的呀,对象是多线程共享的。对吧。那你这个OJ不是多线程共享的吗?
02:05
啊。看的对象,这个是对象不是共享的吗。那你这个对象里边的属性不也只有一份吗?你这个是是一个的话,你这里边儿是也有一个吗。啊,Count对象是多建共享的,那你count对象里边这个实例变量,这个count对象中的实例变量OBJ。也是共享的呀,没毛病啊没毛病。这是共享的。哎,这个这个有多少个同学不理解。就没问题啊,你写他也行啊,来走一个。啊。样吧。是不是跟写this是一样的,没区别?
03:00
This指的是当前对象。为啥?各位,我问大家一个问题啊。只要是多线程共享的对象,是不是都可以往这写?我这么问你吧。T1线程和T2线程共享,不共享这个对象。就T1和T2线程共享account对象吗?答案是共享。对吧,那这个内存图你们怎么画呀啊。这是一个加号虚拟机啊。是不是?它方法区只有一个吧。堆是不是也只有一个?是不是啊?
04:01
啊。是不堆里有一个。对不对,好,那你堆这一块你扭了几个对象啊。你就说账户吧,你有这个账户对象,是不是有我account那行了,那你你有账户对象,这里边有个有个账户对象,这就是你账户对象。啊,抗对象啊。对,这就account对象,这个account对象里边有什么东西啊各位。它里面有啥呀,有账号有余额有他吧。是不是?账号啊。有余额吧,哎,是不是有个OBJ啊,0X1234保存内存地址指向一个对象吧。它是不是指向了一个对象啊。这对象是不是对象。是不是,哎,那你OBJ这边是不是指向它。
05:04
是这样吗?是不是OB这个属性啊。那我问大家,这个对象是一个对吗?是不是一个。对不对,那那你这个对象里边的这个东西是几个呀。这个是几个呀。是一个吧。诶,没人说话了,是不是一个。是一个那single的这边写一个OJ不行吗。那线程过来之后,找这个obj啊,就找这个对象对象锁呀,这个对象只有一个呀。这个对象它是不是只有一个线程,会把这个对象的对象组是不是占有。接下来T1线程过来把这个对象的对象所占走了,T2线程过来占这个对象,对象所能占住吗?站不住吧?
06:07
是不是站不住啊?排队了呗。排队了呀。这只有一个呀。你这个是共享的,这个里边这个就是共享的呀,这是肯定是共享的呀。是不是,诶没毛病啊,没毛病。是的呀。你呢?括号里边只要放一个共享对象就行。就是括号里边这个,只要是共享对象就行。好,那我再考一下大家啊,再考一下大家注意听啊。代码又变了。啊。
07:00
啊,我挖坑了,各位注意看啊。嗯。这个行不行。这个行不行。这个为啥就不行呢?这个为啥就不可以呀。那那那为啥就不行呢。因为你第一个线程过来执行这个方法的时候。这个地方拗了一个对象对吧。哎,说的太棒了啊,太棒了,一针见血,局部变量。
08:04
会溜出来多个。就是你第二个线程过来,它还会执行这个代码,还会扭个新的对象,所以这个OBJ2和OBJ2不是同一个对象,这样的话两个线程是不是都拿到锁了。思考一下,这样的话就不安全了,你执行一下不安全了啊,你看叭一下全出来了,你看叭一下你看全出来了吧,你看。是不是就不安全了?那为什么?为什么这个不行?原因是你这是个局部变量,每一次执行这个代码都会有个新的对象,这个对象不是共享的。这东西这个对象不是共享的。明白吗?这样写就不安全了啊来。因为OBJ2是局部变量。
09:02
或者OBJ2不是共享对象,就直接这么说就行了。因为OJ2不是共享对象。两个线程不共享呗。你好好想想,两个线程不共享这个对象啊。那你这个就共享了呀。对吧?这不是实例变量吗?这可以,你把obj放过来,你this你可以明白吗?你this可以,你OBBJ就行,但你OBJ2不行,OBG2不行,这不行。所以这个不行,最好写法就是上面那个就采用这种方式。就直接this就行了。来执行。你看。是不是?用也可以吗?没试过。
10:02
没试过,你可以试一下,你可以试一下啊,不过没人往这写空引用。嗯。诶,那如果说我在这个位置写一个这样的东西行不行。说synchronized。然后加一个字符串ABC行吗?行不行?ABC行吗?我们执行一下看看。哎,你看行。是不是,那为啥写个ABC也行啊?因为它在字符串常量池里边,对不对。这个对象是不是只有一个呀。对吧,哎,这个是在字符串常量池当中。
11:03
对不对,哎,那咱们看看啊,这同学说的这个空,这个空行不行。那。那废了。没有这个语法。是不是?哎,有同学来object o等于now把O传进去。行吗?哎,你看我们写个O就行了,来走一下啊。好,出异常了。控制异常。对吧,说你这个地方出现控制异常,所以这个位置不能为囊。不能是空的。啊,不能是空的,所以这个就算了,但你这个可以。空是肯定不行了啊。报错空指针。
12:02
Z型,Obj型ABCAABC可以,然后new一个object就不行了,你看。没区别,那有啥区别。没有区别。你愿意写这次写这次你愿意写他写他,只不过你要写它的话,是所有线程都会同步。你要写他的话,所有线程都会同步。写双引号ABC的话,就是所有线程。T。T2T3T4T5。都会同步。所有的线程啊,都会同步,但如果你写this的话,那就不一定了。假如说我在这里,我再给一个县城各位。我这个线程我能不能再给一个呀,叫第三行吗?再给个线程,我拗的这个地方的账户我就不是act了呀,有没有可能我再去有个新的对象叫ACT2啊,那这样ACT2拿过来放到这个位置上。
13:10
好,那我问大家,如果是T3线程执行到这儿的话,是不是就如果是这次的话,是不是就没事儿,就不用排队。诶,文杰听听懂了吗?听没听懂。如果new一个新的线程,把上面这个对象再new这个新的传进去了。那么这个时候。在执行这里的时候,这个ABC和Z就不一样了,因为你ABC会导致你所有的线程都会同步。而你的这个Z呢,你就要记住,如果T1线程和T2线程共享这个对象的话。那么T1和T2就会排队,如果T3线程呢,你你你你不共享这个对象,T3线程有自己的一个账户对象,那这样的话,这个Z它能拿拿到自己的锁,他就进来执行了。
14:05
他就他就会进来执行。我不知道大家有没有听明白啊,有没有听明白。这个听明白了吗?就是说刚才有同学问,这个和ABC有什么区别?总之我觉得呀。亘古不变的一个原理,你要掌握住就行了。亘古不变的原理是啥?各位?就到底线程能不能进来这个大框里边执行,就要看这个对象锁能不能拿到这个对象,它只有一把锁。永远记住,只有一把。一战了。A占了,B不能占。明白吧,但是A。字符串这样三个都要排队,This只执行你的需要对象写成this就行了。我说一下各位啊,咱们不要讨论这个this还是这个那个的,你就永远记住一句话。
15:05
这个位置写的那个对象。是不是你要排队的这几个对象共享的就行了,这个位置假如说T1到T5建成你T1T2T3。共享某一个对象,但是T和T5不共享这个对象。比如说T1 T2 T3呢,它的共享厕所是在二楼,T4和T5呢,他们也有自己的洗手间在三楼。对吧,虽然都是洗手间,但是呢,他有他们自己的洗手间,你们有你们自己的洗手间,T1T2T3,你要想让他们去共享的话,那你这边呢,就得写二楼的洗手间。听懂了吗?如果说你现在呢,想让T4和T5同步的话,那你这个位置就得写三楼的洗手间,你这个对象啊,总之是要写的是什么,是你上面这个线程共享的对象。你必须得是这个对象,得是你们三个共享的。结果这个不共享。
16:01
或者说你们两个共享的,这三个不共享,当然如果你想让T1T2T3T4T5都同步的话,哎,那么这个地方写一个字母串。这样的话,哎,就可以共享了,就咱们都都都都共享了,就这意思。啊,大家好好思考一下,好好思考一下,写这个也可以没问题啊,但最完美就是写这个了,就写成这种语法最好了。因为这个该同步的时候同步,不该同步的时候不同步,你看。他别的县城去对别的账户去操作,你同步个啥呀。对吧,你别的县城是操作的是这个账户,操作的不是这个账户,你跟他同步干啥呀,没有意义呀。咋的,你要取个款,让田先全天人都等呗,你要取个款,你想想你要取取款。难道要让全天下人都懂吗?
17:02
不应该。对吧,只有什么呀,有同时对你这一个账户进行取款的时候需要等待。别人取钱的时候是从。其他账户中取钱。不需要等待。这个线程对的是这个账户进行取款的,所以他就不用等了,但如果还是那句话,你要写ABC的话,对不起,你要写上ABC,那就代表全天下人都等,因为ABC在池里边只有一个。你要写this,那就不一样了,因为this会变。会变,会灵活的变动啊,会灵活变动,你好好去想一想吧,行吧,这个博大精深啊,这个东西博大精深可以说。
18:00
对,Synchronized这个东西很好玩,括号当中可以写什么,你可以做测试啊,做一个测试。
我来说两句