使用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
*/