- 作者:老汪软件技巧
- 发表时间:2024-09-11 11:02
- 浏览量:
我们每天出门会锁门,用各种电子设备会设置密码锁,当然今天说的不是这种锁,说的是让你排队的锁,在细致一点就是敲的代码让业务排队的锁,目的是为了不让业务出乱子。
关于这种锁怎么实现的我不知道我也没这个水平,但是通过我观察锁都是有个中间人,在中间人那里老老实实的守规矩排队就可以了,所以锁是中间人提供的,能提供不乱套的中间人就可以提供锁服务,当然有服务就有高低之分也就是重量级,还有中间人在提供锁服务的时候凭借的是自己的意愿这里就有个公平和非公平的区别。
想写深入点但是脑子里面墨水有限,只能说点简单的锁,当然无所更牛逼。
举个例子有规则的单号,例如这种yyyymmdd0000000。
单机就很好办最简单粗暴的办法我们在生成单号的位置直接用synchronized给锁住,为什么要这么写因为我只会这样写,那么这种情况在单机的时候jvm就是所谓的中间人。
过了段时间走运了业务起飞了单机我们抗不住了要加机器,单个jvm是隔离的做不了中间人了,我们怎么办?当然找中间人啊,谁去充当中间人找了一圈要不我们独立一个jvm作为中间人我们从他那里拿单号感觉太费事了,后来发现都要连接数据库(mysql/oracle/redis)并且数据库也提供锁的服务,哈哈新的提供锁的中间人找到了,ZooKeeper也可以提供锁服务但是最近几年网上看不到它的文章少了。
这中间还有个问题就是我排队拿锁时效性的问题,中间人脑子卡住了,去拿锁的路途又遥远我又是个死心眼拿不到我就不回去可怎么办,作为上帝的顾客急不可耐的想要个结果,于是想了个办法我试着去拿,拿不到我在试,运气好了第一次就拿到了,试的多了腻了我就撤了让饿肚子的顾客先填饱肚子了在来试。
上面说的是无限制规则的,那有限制规则的我怎么搞?
比如我今天早上我就运送10辆共享单车到地铁站,出地铁的一大堆赶去上班的打工人,我要提供公平先到先得的原则,我用这个道义维护了一把有形的锁,我卸一辆车排队在前面赶时间的人就可以先扫一辆。维护秩序的是我,我让你们排队,我一辆一辆的发。规则是死的人是活的,如果有一天我碰到了一个喝多了的不讲我这个默认规则的(当然系统是自己设计的,用系统的人是必须得遵守规则的),冲出去把我刚卸下的单车给推走了,现实中我每次只能运这么多共享单车,但是系统是会魔法的会虚构数量的,我只能让用我系统的强制的遵守我设计的规则,当然这个规则不一定是相对公平的非要排队也许你速度快你抢到车子的概率就会大点,我卖完东西我就收摊。
今天就闲扯这么多吧