00:01
那什么情况下我们的数据在多线程的环境下不安全呢?就是什么时候数据在多线程并发的环境下。会存在安全问题呢?就什么时候数据在多线程并发的环境下会存在安全问题呢?来,我们一起来看一个例子啊,看一个例子,我给大家画个图吧。画图啊。呃,这个图呢,咱们这样,比如说呢,我们,嗯。我们两个人同时对同一个银行账户进行取款,大家都知道这个银行卡呀,一般都有一个,都有一个卡会有一个存折,一个卡一个存折是不是,呃有有这样的啊,有这样的,假如说我们把握好机会,对吧,我们我们我们两个人,比如说我我和小鹏是吧,我俩呢,我有我有一个什么呢?小鹏有一个这个这个叫。储这个储蓄卡,呃,我呢,拿着这个储蓄卡的这个折子。
01:04
我俩干啥呢?我俩就去银行取钱,我俩把握好时间是吧,他去这个ATM机上取,我去柜台上取。我俩就把握好这个时间,能不能赚他一笔呢?我们来看看。来,嗯。那么这块呢,咱们呀,假如说这就是那个银行账户。假设啊。银行账户,这个银行账户呢,里边啊,它有存款有1万块钱。有1万啊1万元。嗯。那么这个时候呢,我们有一个线程就是我呗,对吧,有个线程啊,这就是我了。啊。我是一个县城。T线程啊。然后我的目的是取钱,小鹏呢,他也是什么呀,诶取钱。
02:09
小鹏。T2线程。那么这个时候我俩把握好这个时间,能不能赚他一笔呢?我们来试试啊,比如说我我在A这个,我在那个叫什么,我拿着存折,我在那个那个那个叫什么柜台上取,然后小朋友在 atatm机上取啊,假如我们俩同时并发共享同一个数据,大家看啊,我们两个现在同时并发共享同一个账户,共享同一个数据,会不会有问题,比如说我这边呢,他会怎么办啊?会把余额先怎么着,先读出来吧,是不是这个线程得你取钱嘛,先把余额读出来呀。对吧,哎,把余额读出来,就这个过程啊,叫读取余额。那么这个余额呢,读出来之后呢,诶拿到这个余额就是1万是不是啊,1万我要取款多少啊,取款1万取取1万啊取1万等于最后等于零。
03:08
取钱1万元。最后呢,他这个取完款之后啊,他这个结局啊,就是零啊。对吧,哎,就是零啊,那么这个零呢,它最终啊是要干什么呀,是要更新到我们的数据库当中,就这个必须得更新过去。你明白这个意思?更新吧,来更新库吧,我们叫更新库啊。更新账户取款1万更新账户。那么这个更新账户呢,有没有可能在此时发生的网络延迟,就是网网这块有点有点有点慢,正好逮住这个时间的这个发生就这个啊,发生网络延迟了,就是假设这块就延迟了啊延迟。延迟你懂吗?延迟更新了,那么延迟更新的意思就是说,我们这个银行卡的账户里的余额还是1万块钱,如果在此时此刻,小鹏正好抓住这个时机。
04:03
他也去我们这个卡里读了这个钱。有这个可能啊。他就卡里赌了个钱,读到了。对吧,大家只要读到就坏了,大事不妙,对于银行来说可能就亏了。啊,大家想一想。来,我们过来啊。他拿的也是1万。减去多少啊1万。等于多少啊,零吧。是不是这边也是取款什么呀,1万吧,是不是啊,最后呢,这个结果它也是什么呀,也是零。然后为什么,因为这个时候已经拿到这个数据,他已经出问题了,他在这呢读取余额。对不对,读取余额。那读到余额之后呢,他就可以取呀,因为余额够啊,对吧,他就可以取钱取了1万。
05:05
取了1万之后呢,他这还没有更新呢,这个网络恢复了,这个网络恢复了,恢复之后呢,他把这个值怎么着啊,哎,就改了啊,就改成什么了呢。A。他就把这个值呢,给它改成零了啊零元了,那么这个时候呢,接下来我们这个也同样也是往下走呗,更新呗。对吧,哎,这个一更新这个更新余额嘛。更新账户,这个账户一更新呢,他还是把这个零怎么着啊。抹掉是不是,哎变成多少啊,哎变成零吧,对不对,哎变成零,所以说呢,它的余额应该是从这个位置变到这个位置,然后又从这个位置变到什么呀,这个位置。最后的账户的余额,最终定下来的余额还是这个零。那这样的话一共取了多少钱啊?
06:01
啊,一共取款什么呀,2万啊,那银行就哭了。啊,就哭了。啊,然后我俩呢。我俩就去蹲号了啊。号懂吗?顿号去了啊,为啥呢?因为你拿了银行的钱啊,是不是那么多线程并发的环境下,如果对同一个银行账户进行操作,那么这个时候就必然涉及到一个安全的问题。必然涉及到安全的问题,大家想想是不是这样的?来这块呢,我给大家写一下啊,这叫day多少呢。呃,33。对33啊,对33,我们叫多线程并发对同一个账户进行取款。它就会出现这个问题啊,出现这个问题。
07:04
就是这样啊。警察来了。行吧,啊然后呢,这个呢,其实就是多线程并发啊,带来的一个安全问题,大家思考一下,思考一下啊,假如说我和小鹏呢,我俩怎么着呢,我这个取这个钱。我我我俩不是取钱,我俩是查一下银行账户的余额。对我对于这个程序来说,它有没有现成安全问题?有没有现场安全问题,各位?没有吧?因为我不用改这个数据啊,不改这个数据就没事儿,你发现没有,我只是读余额,它也是读余额,那就没关系。大家思考一个问题,就是通过我的一个讲解,你觉得。你觉得我们什么时候需要考虑线程安全问题?什么时候会存在?什么时候数据在多线程并发的环境下会存在安全问题呢?你想想我被这我把这个余额读出来。
08:02
是吧,读出来之后呢,其实我在读的过程当中,只要小鹏读了就废了,我读了他也读了,肯定就废了,不用发生网络延迟,各位只要我俩把握好这个时间,我把余额读出来,他同时也把余额读到,读到内存里边,对吧?读内存当中是1万,他这个地方呢,诶我读出来也是1万,那我就可以取1万,他也可以取1万啊,那这样就有问题啊,所以我在对这个银行账户进行操作的时候,你另外一个线程是不是只能等待,只有说我这个线程T1在这里把这个所有的事情都操作完了。账户变成零了,那么这个时候是不是才能轮到我们这个小鹏来在这操作呀。那这样的话是不是就可以排队了,就等于是县城排队执行啊。县城排队之行就可以避免什么?这个数据的安全问题对不对,就可以解决现成的安全问题了。你好,思考一下是不是这个意思?我们先说第一个问题吧,什么时候数据在多线程并发的环境下会存在安全问题呢?
09:02
什么时候数据在多线程并发的环境下会存在安全问题呢?什么时候啊?哎,三个条件,条件一,多线程并发,条件二有共享数据,条件三共享数据有修改的行为。记住啊,只要是多线程并发的环境下,而且多线程共享同一个数据,并且数据有修改的行为,那么这个时候我们就会存在现成的安全问题啊。满足以上三个条件之后。啊,就会存在什么呀,线程安全问题,各位啊,就存在现场安全问题。嗯。
我来说两句