数据库锁乐观锁:实现方式(CAS:Compare and Swap 比较并交换)
内部使有自旋机制
流程:内存值V,预期值A,新值B
1、更新值时判断内存值(实际在内存中存的值)与预期值(之前读出来的)相等吗
2、如果相等,则把内存更新成新值;如果不等,则不更新
基于ZooKeeper分布式锁的流程
1、在zookeeper指定节点(locks)下创建临时顺序节点node_n
2、获取locks下所有子节点children
3、对子节点按节点自增序号从小到大排序
4、判断本节点是不是第一个子节点,若是,则获取锁;若不是,则监听比该节点小的那个节点的删除事件
5、若监听事件生效,则回到第二步重新进行判断,直到获取到锁
redis全局锁:
加锁:
1、判断锁是否存在,不存在直接调用存储当前线程信息并且设置过期时间,返回nil,告诉客户端直接获取到锁。
2、判断锁是否存在,存在则将重入次数加1,并重新设置过期时间,返回nil,告诉客户端直接获取到锁。
3、被其它线程已经锁定,返回锁有效期的剩余时间,告诉客户端需要等待。
解锁
1、如果lock键不存在,发消息说锁已经可用
2、如果锁不是被当前线程锁定,则返回nil
3、由于支持可重入,在解锁时将重入次数需要减1
4、如果计算后的重入次数>0,则重新设置过期时间
5、如果计算后的重入次数<=0,则发消息说锁已经可用