先创建一个永久节点,叫lockRootNode
如果需要锁,就在这个节点下创建临时顺序节点
通过getChildren获取所有的节点,排序,如果最小的节点等于创建的节点,就获得锁,否则就watch前面一个节点.
如果应用释放锁,就删除自己创建的节点,会通知watch的节点.
因为是临时节点,会随着会话失效而结束,可以防止客户端挂掉没有释放锁的情况
每个节点都会watch前一个节点,节点删除后都会通知它的下一个节点,避免羊群效应.
缺点
如果网络抖动,zookeeper会认为会话失效,并删除节点,使得其他节点获得锁.