我想在这里澄清三个混淆。
问题1)我的第一个问题是,如果我们在spring引导中有一个Java类,并且在类级别上有一个记录器对象。在这个类的某个函数中,我们有async调用。现在这个异步调用何时开始。它会在它的堆栈中创建所有所需变量的单独副本吗?或者它将使用在主线程中在类级别创建的相同对象?
例如,假设我们在类级别有一些记录器对象,我们使用它在主线程中进行日志记录。现在如果我们在异步线程中访问它调用同一个类中的某个方法。这个异步调用是否会使用与main对象相同的记录器对象,或者它将在其堆栈中拥有自己的记录器对象的新副本?
问题2)第二个问题后面是第一个问题的答案,如果异步调用将在父线程中初始化对象的单独副本,那么当两个线程试图同时访问同一个对象时,为什么会发生异常,因为两个线程都有同一个对象的单独副本。
问题3)如果任何bean的作用域是单例的,仍然会在异步调用中创建其对象的新副本?或者在主线程和异步调用之间共享相同的对象?
异步调用调用一个方法,该方法中定义的所有局部变量都存在于该方法调用的堆栈帧上。因此,这些是属于该方法调用的副本,并且只有执行异步方法的线程才能访问它们。
实例变量和类变量,如记录器,与同步调用相同,它们不会被复制。如果你的异步方法引用了一个存储库,而另一个方法引用了同一个存储库,那么这两个方法调用的是同一个对象。
其他的问题似乎是基于对第一个问题的误解。
调用方法的spring组件不应该有会话状态,实例成员应该是其他spring组件。伐木工人被设计成在线程之间共享。