用Zookeeper实现分布式锁其实就是创建一个临时节点:如果临时节点之前不存在,则临时节点创建成功,则这把锁属于你了。
此时有其他人去创建同名的临时节点,如果已经存在了,说明别人已经占有了这把锁,你就失败了,这时候就对那个临时节点注册一个监听器。当锁被释放的时候会通知你然后尝试去创建。
其实释放锁就是删除临时节点,若删除临时节点,ZK会通知别人这个节点被删除了,相当于锁释放了。然后就会尝试再次创建这个临时节点,若创建成功了,则说明获得了锁。
用临时节点来实现分布式锁:加入创建该节点的客户端挂掉了,则会自动删除该节点,让其它客户端能获取该锁。
参考文档:zk分布式的实现。
redis 和 zk 分布式锁对比:redis 获取锁失败时会反复的尝试,会造成性能的开销。ZK会注册监听器监听,假如锁释放掉了会通知。