getLock
获取锁的时候,tryLock判断是否可以拿到锁,如果拿不到锁的话就调用waitLock,然后在getLock递归
tryLock的时候,首先创建有序临时节点,判断是否是第一个节点,是的说明他拿到锁了,不是第一个节点的话,那么就拿到这个节点的子节点集合,然后获取到它的上一个节点,返回false。
tryLock返回false的话,调用waitLock,这个时候将上一个节点注册watch 的删除事件,判断上个节点是否存在,存在的话countLatch阻塞这个线程,如果上个节点unlock 删除节点话,触发这个watch事件,这时候这个线程释放,开始取消这个监听,继续尝试获取锁
使用zk的临时有序节点可以防止出现羊群效应,如果并发集中到一个临时无序节点上,会出现服务器压力过大,这里使用临时有序节点的话,可以使得每一个线程都拿到一个有序id,序号小的优先获取锁,做相应的操作,序号大的按照zk节点的顺序获取锁