今天先聊一下什么背景下会用到锁?什么是锁?
老张和老王分别是北京的两个民工,为了过年回家,都去网上买票,都到同一个地方,但是回家的票只有一张了,由于他俩都看到有一张票,于是都去抢,不巧的是老张在买的过程中,还没付完钱,老王也点了,所以他们都抢到一张票,但是实际只有一个座位,于是出现了两个人的票的一样的,列车员发现这个问题后经过层层上报,到了程序员码农的手里,这么严重的问题一定要赶紧解决啊,即使两个人同时点,也只能有一个人买到,怎么办?加锁!一个程序员老鸟说到。
码农老菜鸟慢慢道来:
先分析原因:电脑中心收到买票指令的时候,会先看看有没有票,有的话,就让买家进入付款环节,付完款后就把票的数量减去1个。老张没付完款的时候,这时候中心显示还是1张票,所以老王也顺利进入付款环节,这时候两个人都付完钱后,票的数量减少到-1个,于是出现上文中两个人都买到票的现象。
解决办法:也即是说如果有两个人都去点购票按钮的时候,老张和老王的电脑把两个人买票指令同时发到卖票中心的电脑上。卖票中心里有个很多叫做线程的家伙,这些家伙负责买票的全流程。这时候两个线程都接到了指令,卖票的电脑对线程说:你俩谁先得到锁,谁就有权利得到那张票。顺序总是有先后,即使差0.00000000(省略无数0).1秒。卖票中心提前跟所有线程讲好了,谁先来的,这个锁给谁,拿到锁后,立即锁上门,给每个线程15分钟付款时间,时间一到,锁自动打开,老张的线程快了一点点到,所以他拿到锁后,他进入电脑中心后,立即锁住门,虽然没有付完钱,但是谁都进不去了,老张有15分钟的付款时间,付完后这票就是他的了, 等老张付完钱,卖票中心说了,最后一张票已经卖完了,大家不要抢了。
当然如果老张的卡里巧合没有钱了,15分钟时间也到了,锁就打开了,这时其他人也是按照先来后到的顺序开始竞争这个锁。直到有人付完钱为止。