setnx 如果不存在就set,value为currenttime+timeout 成功返回1,不成功返回0。
成功后获取锁,expire设置过期时间。
执行业务
释放锁。
不成功获取锁失败,get(lockkey) ,比较当前时间,和lockvalue,如果大于,这说明之前持有锁已过期,否则,锁依然存在。
锁过期,执行getset(lockkey),返回之前的值oldlockvalue,比较oldlockvalue=null说明锁已释放,oldlockvalue=lockvalue,相等说明没有其他线程获取锁,则可以得到锁,否则有其他线程占用锁。
zookeeper分布式锁
先创建一个锁目录
线程a要获取锁先在目录下按顺序创建一个节点
获取目录下所有子节点,找到比自己小的节点 ,不存在则获取锁。
线程B则创建节点后再判断自己是不是最小的,然后监听子节点
线程a释放锁后,删除自己的节点,b监听到后
网友评论