把稳: 先启动1然后启动2
main1package com.hgy;import com.hgy.common.redis.RedisLock;import redis.clients.jedis.Jedis;public class RedisLockApp1 { private static RedisLock redisLock; public static void main(String[] args) throws InterruptedException { Jedis client = new Jedis("192.168.200.128", 6379); redisLock = new RedisLock(client); redisLock.lock("demo"); Thread.sleep(3000); for (int i = 0; i < 100; i++) { System.out.println("app1" + i); } Thread.sleep(5000); redisLock.unlock("demo"); System.out.println("App1==> end:" + System.currentTimeMillis()); }}
main2
package com.hgy;import com.hgy.common.redis.RedisLock;import redis.clients.jedis.Jedis;public class RedisLockApp2 { private static RedisLock redisLock; public static void main(String[] args) throws InterruptedException { Jedis client = new Jedis("192.168.200.128", 6379); redisLock = new RedisLock(client); redisLock.lock("demo"); System.out.println("App2==> start:" + System.currentTimeMillis()); for (int i = 0; i < 100; i++) { System.out.println("app2" + i); } redisLock.unlock("demo"); }}
把稳
如果细心的小伙伴儿可能已经创造了unlock实在不是一个原子操作,可能在未发布但删除key之后的这段韶光如果有人此时实行lock那么可以直接拿到锁;但是影响不大由于拿到锁之后其他被壅塞的线程被唤醒之后将会连续壅塞
此处unlock中有两个操作,删除key和发送如果在这两个操作之间机器非常并没有新的线程抢占锁那么此时被壅塞的线程将永久壅塞
