• 一个注解替换synchronized关键字:分布式场景下实现方法加锁



    一、前言

    单机部署场景下,当我们需要锁住少量代码块或者方法,通常会使用synchronized关键字进行加锁,如下所示

    public synchronized void test(){
    }
    
    public  void test2(){
        Object o = new Object();
        synchronized (o){
            
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    但是,在分布式场景下,由于jvm之间无法通信,一个服务是无法感知另外一个服务对当前代码快加锁。

    该demo实现了分布式场景下,使用一个注解,对方法进行加锁。单机也可以使用。

    二 、实现原理

    1.原理

    利用Aspect的Around方法,对需要加锁的方法进行动态代理
    在方法执行前获取Redisson锁对象,获取成功,方法执行。执行成功后释放锁
    获取规则根据注解的相关参数进行设置

    用Redisson进行加锁

    2.注解参数描述

    • value锁名称
    • waitTime等待超时:默认5秒,当waitTime<0,表示一直等待获取锁
    • leaseTime过期时长:默认10秒
    • timeUnit时长单位:默认单位秒

    三、公平锁注解(@FairLock)

    @FairLock实现了对接口fairLock加锁,知道该接口当前请求结束后,才可以再次被请求

    @FairLock("fairLock")
        @RequestMapping("fairLock")
        public Date fairLock() throws InterruptedException {
            Thread.sleep(3000);
            return new Date();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    四、读写锁注解(@ReadWriteLock)

    @ReadWriteLock(value = “readWrite”,lockType = ReadWriteLockType.WRITELOCK)
    如下图所示,用@ReadWriteLock对方法进行加读写锁,锁名称为readWrite,类型为读锁

    在这里插入图片描述

    import com.mabo.redis.easycode.readWriteLock.ReadWriteLock;
    import com.mabo.redis.easycode.readWriteLock.ReadWriteLockType;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    @RestController
    public class ReadWriteLockController {
        private static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        @ReadWriteLock(value = "readWrite",lockType = ReadWriteLockType.READLOCK)
        @RequestMapping("read")
        public String read() throws InterruptedException {
            System.out.println("开始执行read");
            Thread.sleep(100000);
            System.out.println("read执行结束");
            return sdf.format(new Date());
        }
    
        /**
         * value锁名称
         * waitTime等待超时:默认5秒,当waitTime<0,表示一直等待获取锁
         * leaseTime过期时长:默认10秒
         * timeUnit时长单位:默认秒
         */
        @ReadWriteLock(value = "readWrite",lockType = ReadWriteLockType.WRITELOCK)
        @RequestMapping("write")
        public String write() throws InterruptedException {
            Thread.sleep(3000);
            return sdf.format(new Date());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    五、下载地址

    github下载地址: github
    https://github.com/MaBo2420935619/EasycodeRedissonLock

  • 相关阅读:
    Raspberry Pi 5 新平台 新芯片组
    QT之QListView的简介
    千呼万唤始出来,从源码到架构的Spring全系列笔记,已全部完毕
    Python离线翻译库argos-translate
    软件设计师下午题
    【Linux】【网络】工具:httplib 库的安装与简单使用
    Leo赠书活动-26期 不同数据库背后的数据存储方案
    TSNE降维学习
    【单元测试】Junit 4(四)--Junit4参数化
    【考研数学】线性代数第五章 —— 特征值和特征向量(2,特征值与特征向量的性质)
  • 原文地址:https://blog.csdn.net/weixin_47053123/article/details/126138519