上读锁
的条件?大家都可以读,之前的锁没有写锁
如何上读锁?
- 创建一个
临时序号节点(-e -s 会话断开自动删除)
,节点的数据是read,代表读锁
- 获取当前zk中序号
比自己小
的所有节点 - 判断
最小节点
是否是读锁
- 如果
不是读锁
,则上锁失败
为最小节点添加监听
。阻塞等待,zk的watch机制会当最小节点
发生变化
时候通知当前节点
,于是再次执行第二步的流程 - 如果
是读锁
则上锁成功
- 如果
上写锁
的条件?只有得到写锁的才可以写,之前没有任何锁
如何上写锁?
- 创建一个
临时序号节点(-e -s 会话断开自动删除)
,节点的数据是write,代表写锁
- 获取当前zk中
所有
的所有节点 - 判断
自己
是否是最小节点
- 如果
不是
,说明前面还有锁
,上锁失败,监听最小节点
,最小节点发生变化,再次执行第二步的流程 - 如果
是
则上锁成功
- 如果
羊群效应:上述方式只要最小节点断开,触发监听,如果并发很大对zk的压力非常大–这就是羊群效应。可以调整成链式监听
解决。后一个节点只监听它前面的节点。