import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.config.Config;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
public class Test {
private static CountDownLatch finish = new CountDownLatch(1);
private static final String KEY = "MyLock";
private static Config config;
private static Redisson redisson;
static {
config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
redisson = (Redisson)Redisson.create(config);
}
public static void main(String[] args) {
Thread thread_1 = new Thread1();
Thread thread_2 = new Thread2();
thread_1.start();
thread_2.start();
}
static class Thread1 extends Thread {
public void run() {
System.out.println("Thread ");
RLock lock = redisson.getLock(KEY);
if(lock.tryLock()){
finish.countDown();
System.out.println("Thread successfulllock");
try {
TimeUnit.SECONDS.sleep(2); // 睡10秒钟 为了让thread_1充分运行
lock.unlock();
System.out.println("Thread unlock " +lock.isLocked());//lock.isLocked() 为 true,是因为 key=MyLock 的lock解锁后,线程2 立即加锁,所以 key=MyLock的 lock此时已经锁上
//finish.countDown();// CountDownLatch 设置为2,这时候就可以发现 lock.isLocked() 为 false
} catch (Exception e) {
e.printStackTrace();
}
}else {
System.out.println("Thread faillock");
}
}
}
static class Thread2 extends Thread {
public void run() {
System.out.println("Thread2 ");
RLock lock = redisson.getLock(KEY);
//等线程1 加锁后再尝试加锁
try {
finish.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
//加锁失败后,循环尝试加锁
while(!lock.tryLock()){
//一旦加锁成功则退出循环
if (lock.tryLock())
break;
}
if(lock.isLocked()){
System.out.println("Thread2 successfulllock");
lock.unlock();
System.out.println("Thread2 unlock "+lock.isLocked());
}
else {
System.out.println("Thread2 faillock");
}
}
}
}
注意:判断是否加锁成功应使用 boolean islocked = lock.tryLock(),不应该使用 lock.isLocked(),lock.isLocked()这个方法是判断 key=MyLock 对应的lock是否被加锁。