# ares5k-zookeeper-distribute-lock
**Repository Path**: cuilingun/ares5k-zookeeper-distribute-lock
## Basic Information
- **Project Name**: ares5k-zookeeper-distribute-lock
- **Description**: ares5k-zookeeper-distribute-lock是基于 curator实现的 zookeeper分布式锁 Aop注解组件 (锁类型: 公平锁, 互斥锁, 读锁, 写锁, 可重入锁(同一路径的锁同一线程可重入))
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 2
- **Created**: 2021-07-26
- **Last Updated**: 2021-08-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ares5k-zookeeper-distribute-lock
ares5k-zookeeper-distribute-lock是基于 curator实现的 zookeeper分布式锁 Aop注解组件
互斥锁: 公平锁, 已规避羊群效应, 同一线程同一节点可重入
写锁: 公平锁, 同一线程同一节点写和读可重入 , 不同线程或不同节点的写和读阻塞, 写锁释放时, 所有读锁全部唤醒
读锁: 公平锁, 都是读锁的情况下非阻塞。与写锁互斥
# **联系方式**
QQ: 16891544
邮箱: 16891544@qq.com
# **说明**
**1.项目只是为了满足作者实际需求所写, 所以并非完美, 进行过压测实验, 但没有在超高并发下使用过, 希望可以给想用注解实现分布式锁的朋友提供个思路**
**2.下载后修改Curator类的zookeeper服务器地址, 然后 mvn clean package,就可以在其他项目里引用了。**
# **使用**案例
互斥锁-未获取到锁时无限等待直到获取锁成功-同一线程同一节点不可重入
```java
@Lock(bizPath = "/product", waitTime = -1, reentrant = false)
public void mutex() throws InterruptedException {
System.out.println("获取互斥锁");
Thread.sleep(Long.MAX_VALUE);
}
```
互斥锁- 未获取到锁时无限等待直到获取锁成功-同一线程同一节点可重入
```java
@Lock(bizPath = "/product", waitTime = -1)
public void mutex(boolean over) throws InterruptedException {
System.out.println("获取互斥锁");
if (over) {
return;
}
((Test)AopContext.currentProxy()).mutex(true);
Thread.sleep(Long.MAX_VALUE);
}
```
互斥锁-等待5秒-5秒后仍为获取锁时的处理
```java
public void errorProcess() throws InterruptedException {
try{
//调用需要分布式锁的方法
((Test)AopContext.currentProxy()).mutex();
}catch (LockException e){
if (e.getLockErrorCode() == LockException.LockErrorCode.ERROR_IN_TIME) {
System.out.println("获取锁超时了");
}
}
}
@Lock(bizPath = "/product", waitTime = 5000)
public void mutex() throws InterruptedException, LockException {
System.out.println("获取互斥锁");
Thread.sleep(Long.MAX_VALUE);
}
```
写锁: 同一线程同一节点-可重入写和读, 不同线程同一节点时读和写都阻塞, 写锁释放后, 所有排队的读锁都被唤醒
```java
@WriteLock(bizPath = "/product", waitTime = -1)
public void write(boolean over) throws InterruptedException, LockException {
System.out.println("获取写锁");
if (over) {
return;
}
((Test)AopContext.currentProxy()).write(true);
Thread.sleep(Long.MAX_VALUE);
}
```
读锁-如果写锁没有占用, 读锁之间是非阻塞的
```java
@ReadLock(bizPath = "/product", waitTime = -1)
public void read() throws InterruptedException, LockException {
System.out.println("获取读锁");
Thread.sleep(Long.MAX_VALUE);
}
```
# 源码地址
- GitHub:https://github.com/ares5k/ares5k-zookeeper-distribute-lock
- 码云:https://gitee.com/ares5k/ares5k-zookeeper-distribute-lock