什么叫分布式锁
自行百度。。。
为什么需要分布式锁
分布式锁技术选型
文件系统
流程
从一个指定的位置判断是否存在lock.txt,不存在则创建(也就是意味着当前线程获得了锁),执行结束后删除lock.txt;存在时则创建不成功(进行循环等待,直到创建成功)。
问题
当t1创建lock.txt后,突然出现问题导致中断,那么lock.txt就不会被t1(创建它的线程)删除。这样就会导致lock.txt一直存在,t2一直循环,也就是出现了死锁。
数据库
其流程与文件系统的类似,都是出现创建锁后因为创建方突然中断而导致锁无法释放。
缓存
使用缓存作为分布式锁,比前面提到的两种方案突出的一个优点就是可以设置锁的过期时间,也就是说即使出现死锁,也只是一小段时间,等待死锁过期后,其他线程就可以继续竞争了。
Zookeeper
为什么说Zookeeper是最合适作为分布式锁的,首先了解下Zookeeper的一些特性。
重点说下临时节点:
临时节点的存活时间依赖于客户端会话,当会话结束,临时节点将会被自动删除(当然也可以手动删除临时节点)。
这也就意味着当连接到Zookeeper的多个客户端中,如果某个客户端断开连接,那它所创建的临时节点就会被自动删除。
介绍了拿到锁后是如何释放的,那接下来就是说明如何竞争锁的。
当进程1拿到锁还未释放时,进程2向锁(节点)注册监听事件,当锁被删除时,触发监听事件,从而唤醒进程2继续抢夺锁。