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