自定义注解,aop实现注解锁

简介: 自定义注解,aop实现注解锁

多线程环境下,会出现线程不安全的问题,所以要对某些方法加锁以保证线程安全

但是如果方法过多,每个方法前后都加这么一句,有点麻烦了,而且代码可读性也会差一些。可以使用aop切面编程,对某些加有特定注解(自定义注解)的方法做加锁操作即可。

自定义注解

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lock {
    String description() default "";
}

定义切面类

public class LockAspect {
    private static Lock lock = new ReentrantLock(false);//互斥锁 参数默认false,不公平锁

    /**
     * 思考:为什么不用synchronized
     * service 默认是单例的,并发下lock只有一个实例
     */
    //Service层切点     用于记录错误日志
    @Pointcut("@annotation(com.example.thread.threaddemo.Lock)")
    public void lockAspect() {
    }

    @Around("lockAspect()")
    public Object around(ProceedingJoinPoint joinPoint) {
        lock.lock();
        Object obj = null;
        try {
            obj = joinPoint.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
        return obj;
    }
}


下图中箭头处改为自己的自定义注解类的全路径,就是包名加类名

 

准备测试,用售票的例子

@Service
public class Ticket1 implements Runnable {
    private int tickets = 100;

    @Override
    @Lock
    public void run() {
        while (tickets > 0) {
//            synchronized (Ticket.class) {
            if (tickets > 0) {
                tickets--;
                System.out.println(Thread.currentThread().getName() + "正在卖票,还剩下" + tickets + "张");
            }
//            }
            try {
                // 休眠一秒,让执行的效果更明显
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Ticket1 ticket = new Ticket1();
        Thread t1 = new Thread(ticket, "窗口一:");
        Thread t2 = new Thread(ticket, "窗口二:");
        Thread t3 = new Thread(ticket, "窗口三:");
        t1.start();
        t2.start();
        t3.start();
    }
}

synchronized锁的代码注释掉了,还需要在方法上加上自定义注解 @Lock

相关文章
|
29天前
|
XML 安全 Java
Spring高手之路19——Spring AOP注解指南
在本文中,我们将深入探索Spring AOP(面向切面编程)的核心概念及其在现代Spring应用中的实际应用。从基本的注解使用到复杂的切面配置,本文将一步步指导你如何利用Spring AOP提升代码的模块化,帮助你在Spring开发路上更进一步。
31 3
Spring高手之路19——Spring AOP注解指南
|
17天前
|
Java Spring 容器
基于注解的Aop开发,实现aop快速入门,基于注解的AOP开发
基于注解的Aop开发,实现aop快速入门,基于注解的AOP开发
|
1月前
|
监控 Java Spring
自定义注解+AOP切面日志+源码
自定义注解+AOP切面日志+源码
20 1
|
12天前
|
容器
springboot-自定义注解拦截ip aop和ioc
springboot-自定义注解拦截ip aop和ioc
|
17天前
|
XML Java 数据格式
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
12 0
|
24天前
|
Java Maven Spring
Spring中AOP最简单实例-@注解形式
Spring中AOP最简单实例-@注解形式
25 0
|
1月前
|
Java Maven 数据安全/隐私保护
详解 Java AOP:面向方面编程的核心概念与 Spring 实现
详解 Java AOP:面向方面编程的核心概念与 Spring 实现
29 1
|
18天前
|
前端开发 Java 数据库
浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
|
18天前
|
XML Java 数据格式
技术好文:Spring基础篇——AOP切面编程
技术好文:Spring基础篇——AOP切面编程
|
2月前
|
XML 监控 安全
Spring特性之一——AOP面向切面编程
Spring特性之一——AOP面向切面编程
43 1