分布式锁-3-zookeeper相互监听的分布式锁
优点
- 避免每次抢锁的时候都要全部去抢,因为第一次抢失败后,后面通过监听机制排队了
- ZK的自带顺序节点,通过ZK内部的ZXID保证顺序的特性
- 释放锁简单,删除节点被删除会事件通知监听节点,实现分布式线程通信
- 临时节点当会话关闭后整个数据节点都会自动删除,释放锁
- 不会出现Redis的数据不一致问题(当出现Leader重选后,新Leader的数据和Old的数据不一致)
缺点
- 顺序临时节点解决了排队问题,类似实现了公平的锁,效率会降低,通常非公平锁比公平锁效率高
- 获取锁的自动超时功能需要自己扩展
- 锁是否支持可重入,需要自己在临时节点的value值中扩展(value=时间戳 / 随机串 / 线程id等)
- 锁的释放需要判断是否当前线程释放,需要自己在临时节点的value值中扩展(value=时间戳 / 随机串 / 线程id等)
- 锁是否支持可中断,也需要自己扩展
ZK临时顺序节点的数据结构
锁的获取和释放流程图
分布式锁对比的时候一般会横向比较 Synchronize、AQS的实现
还有一种通过数据库实现的分布式锁,后面再补充