【问题标题】:has AspectJ execution in thread-safe?AspectJ 在线程安全中执行吗?
【发布时间】:2016-07-07 10:49:35
【问题描述】:
知识问题 = 无代码、无错误、无示例报告。
我在ClassA 的method() 上应用了一个连接点,而ClassA 不是单例。我创建了处理这个连接点的MyAspect。
问题:如果有 2 个调用者 ClassA.method(),并且调用者在 2 个不同的线程上工作(例如 web 请求),AspectJ 将在 2 个不同的线程上运行 MyAspect 还是在一个线程中运行?
我认为 AspectJ 在编织类的同一线程中执行 MyAspect(在本例中为 ClassA)。
【问题讨论】:
标签:
java
multithreading
aspectj
aspect
【解决方案1】:
AspectJ 将在当前线程上执行你的切面。这意味着,如果您有一个多线程执行,那么您的方面也将在多个线程上运行。如果您的方面适用于共享状态,您需要确保以安全的方式访问您的共享状态。
还要注意,除了默认的singleton,还有其他方面的实例化模型。对于单例切面,您的应用中只会创建一个切面实例。您可以使用perthis()、pertarget()、percflow() 或percflowbelow() 修饰符来更改您的方面将如何被实例化,并且AspectJ 将在每个对象上创建您方面的新实例> 或每个控制流。您或许可以使用这些实例化模型隔离方面状态,但如果您使用 shared 状态,则基本规则仍然适用:您需要注意对共享状态的线程安全访问。