将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);
});
}