使用zookeeper实现分布式锁

一、前言

在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源时候,juc包的锁就无能无力了,这时候就需要分布式锁了。常见的有使用zk的最小版本,redis的set函数,数据库锁来实现,本节我们谈谈使用zookeeper的序列节点机制来实现一个分布式锁。

二、使用zookeeper实现分布式锁

首先我们先来看看使用zk实现分布式锁的原理,在zk中是使用文件目录的格式存放节点内容,其中节点类型分为:

  • 持久节点(PERSISTENT ):节点创建后,一直存在,直到主动删除了该节点。
  • 临时节点(EPHEMERAL):生命周期和客户端会话绑定,一旦客户端会话失效,这个节点就会自动删除。
  • 序列节点(SEQUENTIAL ):多个线程创建同一个顺序节点时候,每个线程会得到一个带有编号的节点,节点编号是递增不重复的,如下图:

使用zookeeper实现分布式锁
如上图,三个线程分别创建路径为/root/node的节点,可知在zk服务器端会在root下存在三个node节点,并且器编号唯一递增。

具体在节点创建过程中,可以混合使用,比如临时顺序节点(EPHEMERAL_SEQUENTIAL),这里我们就使用临时顺序节点来实现分布式锁。

原文链接