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               : 活干完了
    
    
  • 相关阅读:
    Sequence-to-Sequence 论文精读(多层LSTM)
    End-to-End Memory Networks 端到端的记忆网络 精读
    深度之眼PyTorch训练营第二期---16、模型保存与加载
    二叉树
    窗体window
    选项卡tabs
    分割按钮splitbutton
    面板pannel
    分页组件pagination
    信息messager
  • 原文地址:https://www.cnblogs.com/huisunan/p/14971854.html
Copyright © 2011-2022 走看看