本文主要对Java里面常见的分布式锁的实现方式和优缺点进行了总结。Java里面实现分布式锁主要分为两种:一种是基于Redis组件,另外一种是基于Zookeeper实现,两种互有优缺点,可以根据业务的实际情况进行选择。

MQ思维导图

1. 利用Redis

1.1. 实现方式
setnx,成功的获得说,并设置锁的超时时间
用户定义的名字为锁名,只为一个map,map的key为uuid:threadid,value为访问次数,因为是可重入锁,所以相当于可能被一个线程获取多次,获取多次再unlock的话,还是不能直接释放掉,只能先将value-1,并继续续,如果真正释放锁,需要将释放的消息publish给其他请求锁的客户端
1.2. 问题1
1.2.1. 描述
锁超时
1.2.2. 解决方法
启一个定时任务根据线程id不断的去续期
1.3. 问题2
1.3.1. 描述
redis节点可能宕机
1.3.2. 解决方法
同时从多个节点获取锁,全部获取成功才算成功拿到锁

2. 利用zk

2.1. 实现方式
2.1.1. 公平锁
创建Sequence节点,最小的获取成功,客户端只监控前一节点的key,缺点是获取锁的速度慢
2.1.2. 非公平锁
创建临时节点,创建成功的获取成功,缺点是获取锁的客户端多的情况下,zk需要通知的节点太多,zk不一定能扛得住

Contents
  1. 1. 1. 利用Redis
  2. 2. 2. 利用zk