
单机情况
线程间同步
- 多线程
进程间同步
- IPC
实现
互斥量
- 整型0-1
- 某个数据的存在与否
数据库唯一索引
上锁
- 向表中插入记录
解锁
- 删除表中的记录
特点
无失效时间
- 定时任务清理表数据
非阻塞
- 轮询
不可重入
- 数据库记录主机和进程的信息,获取锁之前先查表
REDIS SETNX
SETNX
set if not exist
返回值
- 成功时返回true
- 失败时返回false
EXPIRE
- 为某个键值对设置过期时间
REDIS REDLOCK
保证单点故障时分布式锁仍可用
规则
- 尝试从所有Redis实例(n个)获取锁,获得n/2+1个锁后才算上锁成功
- 上锁失败时要释放上锁过程中获得的锁
Zookeeper
模型
树
节点
永久
临时
- 会话结束或超时节点会被删除
有序
- 根据插入顺序形成数字后缀
监听器
- 节点状态变更时通知监听者
分布式锁实现
上锁
- 创建临时且有序的节点
- 如果当前节点不是序号最小的就监听前一个节点并阻塞
解锁
- 删除对应的节点
- 临时节点超时会被删掉