真牛逼!我司用了7年的分布式锁方案...
点击上方“方志朋”,选择“设为星标”
回复”666“获取新整理的面试文章
-
C1加锁成功,不巧的是,这时C1意外的奔溃了,自然就不会释放锁; -
C2,C3尝试加锁,这时key已存在,所以C2,C3去判断key是否已过期,这里假设key已经过期了,所以C2,C3使用set指令去设置值,那两个都会加锁成功,这就闯大祸了;如果使用getset指令,然后判断下返回值是否过期就可以避免这种问题,假如C2跑的快,那C3判断返回的时间戳已经过期,自然就加锁失败;
-
C1获取锁成功,开始执行自己的操作,不幸的是C1这时被阻塞了; -
C2这时来获取锁,由于C1被阻塞了很长时间,所以key对应的value已经过期了,这时C2通过getset加锁成功; -
C1尘封了太久终于被再次唤醒,对于释放锁这件事它可是认真的,伴随着一波del操作,悲剧即将发生; -
C3来获取锁,好家伙,居然一下就成功了,接着就是一波操作猛如虎,接着就是一堆的客诉过来了;
-
C1去redis1加锁,加锁成功后会写到redis2,redis3; -
C2也去redis1加锁,但是此时C2到redis1的网络出现问题,这时C2切换到redis2去加锁,由于第一步中的redis多写并不是原子的,所有就有可能导致C2也获取锁成功;
热门内容:
-
15000 字的 SQL 语句大全
-
为什么阿里巴巴要禁用 Executors 创建线程池?
-
Spring的Controller是单例还是多例?怎么保证并发的安全
-
一款直击痛点的优秀http框架,让我超高效率完成了和第三方接口的对接
-
Spring Boot 中的 RestTemplate不好用?试试 Retrofit !
-
为什么建议大家使用 Linux 开发?爽(外加七个感叹号)
![]()
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ
本文分享自微信公众号 - 方志朋(walkingstory)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

