00:00
出现了这个现身安全问题,那么我们如何解决呢?停掉。这解决方案啊,有两种,第一个。我直接把它。注释掉。那当然它注释掉,我这里加上这个类型是吧,这样的话,这个username就变成什么了。是不是一个局部变量?是不是方法中的局部变量啊,这个变量将来会出现在哪儿?出现在方法战争中啊,而一旦出现在战里边,我们知道战。它不是共享的,每一个线程会有一个方法站,所以它里边的局部变量是不存在现制安全问题的,所以这样一改,现场安全问题就解决了。是吗?还是这个程序啊,这加了一个断点,我们仍然。
01:04
以调试模式来运行。好。看着这个是李四啊。这是张三。我先来,李四走。现在这个username的值四没问题。是吧?现在卡到这儿了啊,它阻塞了,再来看它。再来看他这张三走。他的知现在是张三诶。这这这李四还张三,哎,怎么回事儿?这不对呀。怎么这李四?他不是盖章三了吗?怎么回事儿?
02:03
你看。这这这这怎么怎么搞的。哎,这个我们大家看一下啊,还是这种方式。你看着。我再让他继续。走。这个是不是显示的李四。这儿卡住了。卡住了就是被堵塞了呀。阻塞了。诶,你看这次这是不是还能点呢,走你看。这这这和刚才那个好像就是不一样啊。这怎么回事?两个县城。两个战争。所以你看看这结果是什么?这个李四还是李四?张三还是张三?他没有共享。
03:01
刚才那个是共享了。所以这个现车安全问题在这儿就解决了。这是第一种方案。还有第二种方案。第二种方案是什么呢?这样写了啊。我们说让它变成串行化的。你接收到以后。接收到以后。我只要一修改这个值,我马上给你加上锁。其他再来修改,你先等着,等着我处理完了你再来修改,所以我要加synchronizednch。
04:06
这是不是当前对象锁呀?是这样吗?其实我们不需要这样写啊,太麻烦了。怎么写?圈起来。这里边看看有没有synchronized,有吧,是不是就它这我就放上this就行了。这加上一个什么同步变成线程同步了。这也是成员变量的啊,好,现在重新跑这个程序。重新跑这个程序,那我们得加断点了,加到哪。还是交到他这儿。第八个。
05:04
后台。后退。好,我先来。李四的登陆走。现在他的值肯定是李四吧?对不对。他。在那儿等待的啊。再来走他,我问问你,我要走他的话,他能进来不能。能进到这儿不能。进不来。为什么进不来,我这加着锁呢呀。我还没从他里边出来的,所以你你这个就进不来,看着走。你看他这儿根本就没反应,你发现没?但这已经等待了。他等什么呢?等这把锁呢,他这儿并没有显示,刚才像我们刚才一一点,他走到这里边被阻塞了,被这个断点阻塞了,不是被断点阻塞了,被谁被这把锁给阻塞了。
06:04
所以我们现在做什么做它?让他继续执行完毕。走,李四吧。诶,这时候到这儿又停了,谁停了。张三听到这儿了。你发现没,现在。是变成张三了。再走。是不是张三是不是这个问题也解决了,明显我们看到这俩是不是串行化执行的,他执行完了才能执行他呢。当然了,这种解决方案好不好?他能解决,但是不好这种方案。会使我们的代码效率变得很低。一次只能有一个。线程来访问这段代码。所以啊,这个并不好,这个并不好。
07:03
啊,这是我们萨塔啊,线程安全问题的两种解决方案。
我来说两句