多线程同步和上厕所

多线程同步的通俗理解

我通常喜欢用很生活中的事物来类比要学习的东西,这里我借助上厕所这个事情来理解一下

多线程

首先,线程是一个进程的一个运行单元,我们打开微信,发消息是一个线程,收消息也是一个线程,它们在同时进行。在Java中我们可以建立好几个线程同时进行(不是真正意义上的同时,而是每个线程抢占执行,时间间隔很短,以至于感觉是同时发生,就像走马灯一样),把一个进程比作一个人,线程体是他要做的事情,如果用一个线程的线程体是拉屎操作,另一个线程的线程体是冲厕所操作,两个线程同时启动,就可同时做到一边拉屎一边冲厕所的效果

同步

还是上厕所,如果这个厕所没有门(无同步),那么有多个人上厕所(这里比作多个线程),那么他们是抢着上厕所的,抢到的人可以使用一分钟厕所(时间片),但他不一定这段时间就能完事儿,比如A抢到厕所,一分钟后他还没整完就出来了,他就接着和B、C一起接着抢厕所,直到自己方便完为止(run方法结束)。
那大家觉得这样太不爽,还不如让一个完事后在再抢,在他办事儿的时候大家就等着,所以大家就给这个厕所上了一道门(同步锁),这个锁只有一把,任何东西都能当锁,但这里为了限定就这几个人需要排队,需要一个他们都有的东西,而正好如果有一个东西是他们共享的,如一份报纸(共享对象),那他们就统一把它当做门,谁拿到报纸就表示谁可以上厕所,他可以在报纸涂涂画画,当他上完后,就开抢报纸,下一个拿到报纸的就是修改后的报纸;
然后就是这个数据安全的问题:若是没有这个报纸当门,就是说厕所没有门,A.、B两个人同时抢厕所,还是抢到使用一分钟,A抢到了,他的动作是修改一下最后一页的页码,让最后一页加个5(A线程体a = a + 5),一分钟完了,他只是把报纸看了,记住了有10页,此时还没改,假设随后是B抢到了,B是想把最后的页码减个5(线程体a = a - 5),B也是一分钟读了个大概出来,知道了报纸有10页就出来了,随后A抢到进去改页码,把页码改成了10+5=15页,B拿着报纸也进去了,但是他之前记得的是10页,那他就改成了10-5=5页,后来B也出来了;按道理应该是10+5-5=10,但是由于延迟的问题,导致最终结果是5,这就出现了矛盾,所以线程同步就解决了这个问题:把报纸当成门,谁拿着报纸就让谁全部弄完,把修改的报纸交给下一位,这样就能保证数据合法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值