即墨网站设计wordpress 添加登录按钮
web/
2025/10/5 20:27:01/
文章来源:
即墨网站设计,wordpress 添加登录按钮,网页搭建服务平台,网站建设实训报告doc工作业务中#xff0c;有大量分布式加锁的重复代码#xff0c;存在两个问题#xff0c;一是代码重复率高#xff0c;二是容易产生霰弹式修改#xff0c;使用注解和AOP可以实现代码复用#xff0c;简化分布式锁加锁和解锁流程。 around注解是AspectJ框架提供的#xff0c…工作业务中有大量分布式加锁的重复代码存在两个问题一是代码重复率高二是容易产生霰弹式修改使用注解和AOP可以实现代码复用简化分布式锁加锁和解锁流程。 around注解是AspectJ框架提供的允许我们在目标方法的执行前后进行代码增强。下面通过一个示例来介绍如何使用around注解以及自定义注解实现加解锁ReenTrantLock简化。
改造前原代码 很经典的桥段初始化10个线程每个线程分别执行m1000次若想得到10000的结果则必须加锁同步加锁则需要在执行m前进行加锁在finally语句块中执行解锁操作因此可以通过around注解实现简化。 Service
Slf4j
public class HelloService {private int m 0;private static int nums 0;public ReentrantLock lock;// spel表达式private static final String LOCK_KEY asset_tenant_lock_prefix: T(org.example.Common.ContextHelper).getTenantInfo().getOrgId();AutowiredHelloService helloService;public String doSomeSum() throws InterruptedException {nums;log.info(调用次数{}, nums);m 0;CountDownLatch countDownLatch new CountDownLatch(10);lock new ReentrantLock();for (int i 0; i 10; i) {Thread thread new Thread(() - {for (int j 0; j 1000; j) {helloService.increM();}countDownLatch.countDown();});thread.start();}countDownLatch.await();return String.valueOf(m);}DistributeLock(key LOCK_KEY)public void increM() {lock.lock();try {m;} finally {lock.unlock();}}
}2. 改造第一步创建一个注解 注解名为DistributeLock有一个熟悉key这个例子是为了模仿使用Redis分布式锁
Target(ElementType.METHOD)
Retention(RetentionPolicy.RUNTIME)
public interface DistributeLock {String key();
}3.改造第二步定义一个切面类 切面类中定义一个增强方法useDistributeLock参数joinPoint是切入点distributeLock是切入点形参用于传入key。这里我们key使用的是Spel表达式使用SpelExpressionParser可以求得最终的key值joinPoint.proceed()执行的则是上文提到的原方法的执行内容m。
Component
Slf4j
public class DistributeLockAspect {private static ReentrantLock lock new ReentrantLock();Around(annotation(distributeLock))public Object useDistributeLock(ProceedingJoinPoint joinPoint, DistributeLock distributeLock) throws Throwable {lock.lock();org.springframework.expression.ExpressionParser parser new SpelExpressionParser();String lockKey (String) parser.parseExpression(distributeLock.key()).getValue();log.info(lockKey);try {return joinPoint.proceed();} finally {lock.unlock();}}
}4.改造第三步使用 使用很简单只需要在需要增强的方法上加上我们创建的注解并且给注解的属性Key一个字符串形式的Spel表达式即可实现加解锁操作。代码行数大大减少。
public class HelloService {private int m 0;private static int nums 0;public ReentrantLock lock;// spel表达式private static final String LOCK_KEY asset_tenant_lock_prefix: T(org.example.Common.ContextHelper).getTenantInfo().getOrgId();AutowiredHelloService helloService;public String doSomeSum() throws InterruptedException {nums;log.info(调用次数{}, nums);m 0;CountDownLatch countDownLatch new CountDownLatch(10);lock new ReentrantLock();for (int i 0; i 10; i) {Thread thread new Thread(() - {for (int j 0; j 1000; j) {helloService.increM();}countDownLatch.countDown();});thread.start();}countDownLatch.await();return String.valueOf(m);}DistributeLock(key LOCK_KEY)public void increM() {m;}
}5.最终测试结果 最终的测试结果是10000说明加锁成功 来看看我们日志打印的Lock_key值是否符合预期符合预期
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/87545.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!