# Zookeeper分布式锁场景

### Zookeeper分布式锁场景

### 线程进程资源竞争

当有一个线程或进程在对资源进行操作时，其他线程或进程都不可以对这个资\
原进行操作，直到该线程或进程完成操作，其他线程或进程才能对该资源进\
行操作，而其他线程或进程又处于等待状态。

![](https://2663285815-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LfnT31deyW842ExZVDh%2F-LfnTAqGO4YVUXXW5O6w%2F-LfnTMHmzm1rOh1Y87O1%2F1.png?generation=1558862985039483\&alt=media)

## 线程同步的方式和机制

临界区、互斥量、事件、信号量四种方式

临界区（Critical Section）、互斥量（Mutex）、信号量（Semaphore）、事件（Event）的区别

1、临界区：通过对多线程的串行化来访问公共资源或一段代码，速度快，适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问，如果有多个线程试图访问公共资源，那么在有一个线程进入后，其他试图访问公共资源的线程将被挂起，并一直等到进入临界区的线程离开，临界区在被释放后，其他线程才可以抢占。

> 通过对多线程的串行化来访问**公共资源或一段代码**
>
> `synchronized` 修饰的java方法\
> 仅用于线程同步

2、互斥量：采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限，因为互斥对象只有一个，所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享，还能实现不同应用程序的公共资源安全共享.

> 只有拥有互斥对象的线程才有访问公共资源的权限，因为互斥对象只有一个
>
> * `synchronized` -  修饰的代码块
> * `java.util.concurrent.locks.Lock` - 分布式锁的主要实现机制

3、信号量：它允许多个线程在同一时刻访问同一资源，但是需要限制在同一时刻访问此资源的最大线程数目

> 解决执行顺序`CountDownLatch`,`CyclicBarrier`和`Semaphore`的问题

4、事 件： 通过通知操作的方式来保持线程的同步，还可以方便实现对多个线程的优先级比较的操作

### 分布式锁实现的技术

基于数据实现分布式锁

* 性能较差，容易出现单点故障
* 锁没有失效事件,容易死锁。
* 非阻塞式
* 不可重入

基于缓存实现分布式锁

* 锁没有失效事件,容易死锁
* 非阻塞式
* 不可重入

基于Zookeeper实现分布式锁

* 实现相对简单
* 可靠性高
* 性能较好

### Zookeeper实战分布式锁

**分布式锁解决思路**&#x20;

分布式锁使用zk，在zk上创建一个临时节点（有效期），使用临时节点作为锁，因为节点不允许重复。

如果能创建节点成功，生成订单号，如果创建节点失败，等待。临时节点zk关闭，释放锁，其他节点就可以重新生成订单号。

**场景描述**

在线程高并发场景下,生成唯一的订单编号\
如:2018-07-14-20-52-31-01\
年 月 日 时 分 秒 序号

![](https://2663285815-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LfnT31deyW842ExZVDh%2F-LfnTAqGO4YVUXXW5O6w%2F-LfnTMHpftRxJ-uAUGzp%2F2.png?generation=1558862985072763\&alt=media)
