redissonclient.getFairLock
时间: 2023-10-30 19:04:55 浏览: 228
redissonclient.getFairLock是Redisson客户端的一个方法,用于获取一个公平锁(Fair Lock)。公平锁是一种保证多个线程按照请求的顺序获取锁的机制,即先请求的线程先获取到锁。使用公平锁可以避免某些线程长时间等待锁的情况,保证了公平性。
该方法返回一个RFairLock对象,可以使用它进行加锁和解锁操作。例如,可以通过调用lock方法获取锁,然后在执行完需要加锁的代码后调用unlock方法释放锁。公平锁的使用可以确保多个线程按照请求的顺序获得锁,并且避免了饥饿等问题。
相关问题
@Slf4j @Aspect @Component public class DistributedLockAspect { private final ExpressionParser parser = new SpelExpressionParser(); private final DefaultParameterNameDiscoverer discoverer = new DefaultParameterNameDiscoverer(); @Autowired private RedissonClient redissonClient; @Around("@annotation(distributedLock)") public Object lock(ProceedingJoinPoint joinPoint, DistributedLock distributedLock) throws Throwable { // 使用spel解析注解中定义的key String keyValue = parseKeyValue(joinPoint, distributedLock.value()); // 拼接出锁名称 String lockName = connectLockName(distributedLock.keyPrefix(), keyValue, distributedLock.separator()); // 获取锁 RLock lock = getLock(distributedLock.lockModel(), lockName); try { if (lock.tryLock(distributedLock.waitLockMSec(), distributedLock.lockExpireMSec(), TimeUnit.MILLISECONDS)) { log.info("获取锁:{}", lockName); return joinPoint.proceed(); } throw new LockException(distributedLock.message()); } finally { lock.unlock(); } } private RLock getLock(DistributedLock.LockModel lockModel, String lockName) { switch (lockModel) { case FAIR: //公平锁 return redissonClient.getFairLock(lockName); case READ: //读之前加读锁,读锁的作用就是等待该lockkey释放写锁以后再读 return redissonClient.getReadWriteLock(lockName).readLock(); case WRITE: //写之前加写锁,写锁加锁成功,读锁只能等待 return redissonClient.getReadWriteLock(lockName).writeLock(); case REENTRANT: default: //可重入锁 return redissonClient.getLock(lockName); } } private String connectLockName(String prefix, String key, String separator) { if (StringUtils.isNotBlank(prefix)) { return prefix + separator + key; } return key; } private String parseKeyValue(ProceedingJoinPoint joinPoints, String elExpr) { MethodSignature methodSignature = (MethodSignature) joinPoints.getSignature(); Method method = methodSignature.getMethod(); //获取方法的参数值 Object[] args = joinPoints.getArgs(); EvaluationContext context = new StandardEvaluationContext(); String[] params = discoverer.getParameterNames(method); if (params != null) { for (int i = 0; i < params.length; i++) { context.setVariable(params[i], args[i]); } } //根据spel表达式获取值 Expression expression = parser.parseExpression(elExpr); Object value = expression.getValue(context); if (value != null) { return value.toString(); } return "defaultLockKey"; } }解释一下这段代码
这段代码是一个基于Spring AOP实现的分布式锁切面,它使用了Redisson作为分布式锁的实现。在使用@DistributedLock注解的方法上,会拦截方法的执行,获取注解中定义的key值,拼接出锁名称,然后获取对应的锁。如果获取锁成功,则执行方法,否则抛出LockException异常。其中,锁的类型可以是可重入锁、公平锁、读锁或写锁,可以通过注解中的lockModel属性指定。
阅读全文