分布式锁 redis

2 篇文章 0 订阅

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是否被加锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值