关于锁和优先级和从前有座山上有条路
1661 2021-05-11 09:23
锁:门上有锁,代表门里面的资源我要在一定时间内单独使用,不能分享,不能被剥夺。
事务:一件事是由很多小步骤组成的。最小的步骤我们成为原子事件,众多的原子事件或者单个原子事件(不需要资源的我们这里不管)构成一项事务。完成一个事务需要配合顺序(不需要配合可以并行的我们这里不管)。
死锁:两个线程(两辆车甲、乙),对向竞争资源(从A到B、从B到A),甲锁住了A要去B,乙锁住了B要去A。甲经过A和B才算完成任务、乙经过B和A才算完成任务,两个人,因为目的地中的第二个被锁住了而不能前进,造成死锁。
解决死锁:
- 调整顺序
- 超时弃锁
悲观锁:策略为“先取锁再访问”。
- 共享锁:又称为“读锁”,只能读不能修改
- 排它锁:只有获取排他锁的事务是可以对数据行读取和修改
乐观锁:策略为:不需要借助数据库的锁机制。主要就是两个步骤:冲突检测和数据更新。更新失败之后交给用户选择如何处理,重新读取?还是等待提交。
悲观锁秒杀,点击一次没反应,因为在等待。再点击一次,剩余数量不变,但是自己会有两次请求在竞争。不会超卖,不会有剩余产品。
乐观锁秒杀,点击一次有可能没反应,但是一定会在定时器结束之后有反应,再点击一次,剩余数量会改变,自己的下一次竞争开始生效,第一次会在超时后自动放弃。不会超卖,但是可能会有剩余。
自旋锁:当我想锁住一个门而发现上面有所的时候,我开始转圈,跳舞、分散注意力、避免直视。跳了一支舞之后,我再看有没有人解锁。如果还有锁,我继续跳个舞。cas参见这篇文章
优先级:我跳舞的时间不是我说了算,而是接受一个叫人工智障的程序给我算出来的固定的时间。他们知道我的优先级。知道我花了多少钱是什么级别的vip。他们说我每次跳舞的时间是20秒,远远小于那些普通用户的20分钟。我在很有优越感的同时,也被告知,可能刚好有一个比我高一级的用户每15秒钟解锁然后休息5分钟上锁,导致每20秒钟我看到门都是锁着的。好巧不巧的有一个等级比我低很多的用户,他的自旋时间是20分钟零16秒,恰巧他赶在比我高级的用户休息的时候上了一把锁。世界还真是 给人留有活路呢。
全部评论