Redis实践 -使用Redis分布式锁

使用Redis来实现分布式锁

public class LockTest {

    private final Jedis jedis;

    public LockTest() {
        jedis=new Jedis("localhost",6379);
        jedis.auth("iostream");
    }

    public void solve() throws InterruptedException {
        //jedis.set()是原子操作    
        if(jedis.set("list","test","nx","ex",7)!=null){ //这个操作是缓存list并设置7秒后过期
            System.out.println(Thread.currentThread().getName()+" holds lock");
            Thread.sleep(3000); //模拟长时间工作
            throw new RuntimeException(); //模拟运行过程出现异常
        }else{
            System.out.println("锁正在被占领");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        LockTest lockTest=new LockTest();
        new Thread( () -> {
            try {
                lockTest.solve();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } ).start();

        new Thread( () -> {
            try {
                Thread.sleep(1000);
                lockTest.solve();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } ).start();

        Thread.sleep(6000);
        System.out.println(lockTest.jedis.get("list")); //此时锁还没有过期

        Thread.sleep(1000);
        System.out.println(lockTest.jedis.get("list")); //null 过期  Thread0线程执行过程出现异常锁仍然能够被安全释放
    }
}

/*
Thread-0 holds lock
锁正在被占领
Exception in thread "Thread-0" java.lang.RuntimeException
    at com.viscu.Redis.LockTest.solve(LockTest.java:24)
    at com.viscu.Redis.LockTest.lambda$main$0(LockTest.java:34)
    at java.lang.Thread.run(Thread.java:748)
test
null
*/

猜你喜欢

转载自www.cnblogs.com/viscu/p/9819844.html