中国十大门户网站,seo引擎优化是什么意思,wordpress自定义页面插件,良品铺子网站建设设计目录
使用注解定义分布式锁 Aop例子
retention 表示在什么时候可以用#xff0c;runtime表示在运行期可以用
target表示可以用在哪些上面 inherited表示可以被继承 切点和切面类
重点是 pjp.proceed(args) 这个就是执行目标方法#xff0c;下面的这一段没啥意思
也可…目录
使用注解定义分布式锁 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 MapMyLockType, FunctionString, 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方法 锁失败策略
多线程争抢锁大部分线程会获取锁失败而失败后的处理方案和策略是多种多样的。目前我们获取锁失败后就是直接抛出异常没有其它策略这与实际需求不一定相符。 策略模式
根据不同的策略选择使用不同的策略 工厂模式是生成不同的对象