zoukankan      html  css  js  c++  java
  • Redis锁的简单实现

    RedisLock

    @Component
    public class RedisLock {
        @Autowired
        RedisTemplate<String, String> redisTemplate;
        ValueOperations<String, String> operations;
    
        @PostConstruct
        public void init() {
            operations = redisTemplate.opsForValue();
        }
    
        private String lockName = "redisLock";
        //尝试加锁,可以根据自己的需求加上过期时间,也可也设置看门狗来对锁进行延时
        public boolean tryLock() {
            return Boolean.TRUE.equals(operations.setIfAbsent(lockName, Thread.currentThread().getName()));
        }
        //尝试解锁,只能解自己线程的锁
        public boolean tryRelease() {
            String threadName = operations.get(lockName);
            if (Thread.currentThread().getName().equals(threadName)) {
                return Boolean.TRUE.equals(redisTemplate.delete(lockName));
            }
            return false;
        }
    
    }
    

    竞争线程

    @Slf4j
    public class LockThread extends Thread {
        RedisLock redisLock;
    
        public LockThread(RedisLock redisLock) {
            this.redisLock = redisLock;
        }
    
        @SneakyThrows
        @Override
        public void run() {
            //尝试在3s内获取到锁
            for (int i = 0; i < 30; i++) {
                boolean lock = redisLock.tryLock();
                if (lock) {
                    log.info("开始干活");
                    TimeUnit.SECONDS.sleep(1);
                    log.info("活干完了");
                    redisLock.tryRelease();
                    break;
                } else {
                    log.info("枪锁失败");
                    TimeUnit.MILLISECONDS.sleep(100);
                }
            }
        }
    }
    

    测试类

    @SpringBootTest
    public class RedisLockTest {
        @Autowired
        RedisLock redisLock;
    
        @Test
        public void test() throws InterruptedException {
            LockThread lockThread = new LockThread(redisLock);
            LockThread lockThread2 = new LockThread(redisLock);
            lockThread.start();
            lockThread2.start();
            lockThread.join();
            lockThread2.join();
        }
    }
    
    
    2021-07-05 12:03:46.723  INFO 29540 --- [       Thread-3] com.study.redis.LockThread               : 抢锁失败
    2021-07-05 12:03:46.723  INFO 29540 --- [       Thread-2] com.study.redis.LockThread               : 开始干活
    2021-07-05 12:03:46.825  INFO 29540 --- [       Thread-3] com.study.redis.LockThread               : 抢锁失败
    2021-07-05 12:03:46.936  INFO 29540 --- [       Thread-3] com.study.redis.LockThread               : 抢锁失败
    2021-07-05 12:03:47.043  INFO 29540 --- [       Thread-3] com.study.redis.LockThread               : 抢锁失败
    2021-07-05 12:03:47.153  INFO 29540 --- [       Thread-3] com.study.redis.LockThread               : 抢锁失败
    2021-07-05 12:03:47.261  INFO 29540 --- [       Thread-3] com.study.redis.LockThread               : 抢锁失败
    2021-07-05 12:03:47.363  INFO 29540 --- [       Thread-3] com.study.redis.LockThread               : 抢锁失败
    2021-07-05 12:03:47.480  INFO 29540 --- [       Thread-3] com.study.redis.LockThread               : 抢锁失败
    2021-07-05 12:03:47.588  INFO 29540 --- [       Thread-3] com.study.redis.LockThread               : 抢锁失败
    2021-07-05 12:03:47.696  INFO 29540 --- [       Thread-3] com.study.redis.LockThread               : 抢锁失败
    2021-07-05 12:03:47.727  INFO 29540 --- [       Thread-2] com.study.redis.LockThread               : 活干完了
    2021-07-05 12:03:47.806  INFO 29540 --- [       Thread-3] com.study.redis.LockThread               : 开始干活
    2021-07-05 12:03:48.818  INFO 29540 --- [       Thread-3] com.study.redis.LockThread               : 活干完了
    
    
  • 相关阅读:
    BZOJ1257:[CQOI2007]余数之和——题解+证明
    BZOJ3781:小B的询问——题解
    BZOJ2038:[2009国家集训队]小Z的袜子——题解
    BZOJ3052 & UOJ58:[WC2013]糖果公园——题解
    BZOJ1086:[SCOI2005]王室联邦——题解
    BZOJ1878:[SDOI2009]HH的项链——题解
    BZOJ2453:维护队列——题解
    美团新零售招聘-高级测试开发(20k-50k/月)
    Shopee招聘-测试开发leader(30k-60k/月)
    蚂蚁金服招聘-无线测试开发(20k-36k/月)
  • 原文地址:https://www.cnblogs.com/huisunan/p/14971854.html
Copyright © 2011-2022 走看看