自定义注解

目录

使用注解定义分布式锁 


Aop例子

retention 表示在什么时候可以用,runtime表示在运行期可以用

target表示可以用在哪些上面  inherited表示可以被继承  

 切点和切面类

重点是 pjp.proceed(args) 这个就是执行目标方法,下面的这一段没啥意思

也可以直接把注解写在切面注解上,但是注解名必须写在方法的参数上,保持一致

使用注解定义分布式锁 

package com.tianji.promotion.utils;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyLock {
    String name();

    long waitTime() default 1;

    long leaseTime() default -1;

    TimeUnit unit() default TimeUnit.SECONDS;
}

没有传过期时间,默认是-1  过期时间是30秒,传了过期时间 看门狗会失效

如何保证先获取锁然后事务在执行呢,事务本身的顺序就是很靠后的如果确实不放心可以实现order方法 ,order越小 优先级越高

但是这个锁类型是写死的,如何根据传入锁类型参数的不同生成不同的锁对象呢?

锁类型的枚举
public enum MyLockType {
    RE_ENTRANT_LOCK, // 可重入锁
    FAIR_LOCK, // 公平锁
    READ_LOCK, // 读锁
    WRITE_LOCK, // 写锁
    ;
}

 

 redission不同锁类型的工厂

工厂模式,根据参数不同获取不同的对象,function是方法引用,apply就是去执行他具体的方法

里面使用了一个枚举map,比hashmap效率高一些

package com.tianji.promotion.utils;

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Component;

import java.util.EnumMap;
import java.util.Map;
import java.util.function.Function;

import static com.tianji.promotion.utils.MyLockType.*;

@Component
public class MyLockFactory {

    private final Map<MyLockType, Function<String, RLock>> lockHandlers;

    public MyLockFactory(RedissonClient redissonClient) {
        this.lockHandlers = new EnumMap<>(MyLockType.class);
        this.lockHandlers.put(RE_ENTRANT_LOCK, redissonClient::getLock);
        this.lockHandlers.put(FAIR_LOCK, redissonClient::getFairLock);
        this.lockHandlers.put(READ_LOCK, name -> redissonClient.getReadWriteLock(name).readLock());
        this.lockHandlers.put(WRITE_LOCK, name -> redissonClient.getReadWriteLock(name).writeLock());
    }

    public RLock getLock(MyLockType lockType, String name){
        return lockHandlers.get(lockType).apply(name);
    }
}

 如果看不懂 ,可以不用 拉姆达表达式,获取的时候还是apply方法

 

锁失败策略

多线程争抢锁,大部分线程会获取锁失败,而失败后的处理方案和策略是多种多样的。目前,我们获取锁失败后就是直接抛出异常,没有其它策略,这与实际需求不一定相符。

 

策略模式

根据不同的策略选择使用不同的策略 ,,工厂模式是生成不同的对象 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值