将Spring AOP与异步线程处理一起使用是否安全?

让我用一个代码示例使其更加清楚:

@AfterReturning(pointcut = within(com..*)", returning = "result")
public void sampleWithNewThread(JoinPoint joinPoint, Object result) {
    executorService.submit(() -> {
         dbConnection.write(joinPoint.getSignature().getName());
         dbConnection.write(result);
    });
}


在新线程中“触摸” joinPoint和结果对象是否安全?这些线程安全吗?

我很确定它还可以,但是我找不到它的证明参考。

最佳答案

JoinPoint以及您可以从中检索的类型的Javadoc(例如Signature)没有明确声明它们是线程安全的。但是,它们没有提供任何对它们进行突变的方法。他们只公开getter方法。

您可以以此表示它们是不可变的,但是您不必这样做。只需在调用@AfterReturning带注释的方法的线程中检索值,然后将这些值传递给另一个线程即可。

@AfterReturning(pointcut = within(com..*)", returning = "result")
public void sampleWithNewThread(JoinPoint joinPoint, Object result) {
    final String signatureName = joinPoint.getSignature().getName();
    executorService.submit(() -> {
         dbConnection.write(signatureName);
         dbConnection.write(result);
    });
}

07-27 13:47