1、自定义的锁注解
@Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Servicelock { String description() default ""; }
2、aop切面
@Component @Scope @Aspect @Order(1) // order越小越是最先执行,但更重要的是最先执行的最后结束。order默认值是2147483647 public class LockAspect { /** * 思考:为什么不用synchronized * service 默认是单例的,并发下lock只有一个实例 */ private static Lock lock = new ReentrantLock(true);//互斥锁 参数默认false,不公平锁 //Service层切点 用于记录错误日志 @Pointcut("@annotation(com.itstyle.seckill.common.aop.Servicelock)") public void lockAspect() { } @Around("lockAspect()") public Object around(ProceedingJoinPoint joinPoint) { lock.lock(); Object obj = null; try { obj = joinPoint.proceed(); } catch (Throwable e) { e.printStackTrace(); throw new RuntimeException(); } finally{ lock.unlock(); } return obj; } }
3、使用:
在需要添加同步方法上使用注解即可
最新评论
mat插件可以检测内存数据
标识接口?
序列化serializabel就是一个标识
就差一个MAC了
mark
除了预置sql查询字段,其他我竟然都没用过
可以,这个问题遇到过
mybatis多个参数: 1. 注解(最常用) 2. 转化为对象或MAP 3. 按顺序(这个最蠢,写的代码看得费劲) 单个参数需要注意得: 1.基本数据类型随便写 2.数组用array,l