首页 文章

Singleton bean与ThreadLocal变量行为

提问于
浏览
0

我有一个默认单例范围的bean . 这个bean可以被许多线程访问,我希望student对象特定于每个线程 . 我正在休息时使用 spring 靴

在这样的实现中,singleton bean如何处理由不同线程设置的学生对象 . spring是否为每个线程返回相同的A对象,但是对于student变量有自定义对象值吗?

@Service
class A{

 private InheritableThreadLocal<Student> student;

}

1 回答

  • 1

    Spring将只创建 class A 的一个实例对象(让我们称之为 objA ),并且在该对象中,线程局部变量将驻留 . 请注意,Spring不会将objA返回给任何线程,但线程会执行 objA 内部或与之关联的逻辑 .

    但是,Threadlocal变量值仅对执行逻辑的线程可见 . 在这种情况下,即使只有一个对象实例 class AobjA ),每个执行线程都会根据ThreadLocal javadoc为线程局部变量 student 提供自己的值,

    这些变量与其正常对应物的不同之处在于,访问其中的每个线程(通过其{@code get}或{@code set}方法)都有自己的,独立初始化的变量副本

    请注意,在这里您使用了 InheritableThreadLocal 并根据其java doc

    此类扩展ThreadLocal以提供从父线程到子线程的值的继承:当创建子线程时,子进程接收父对象具有值的所有可继承线程局部变量的初始值 .

    因此,如果在父线程中设置线程本地值,则子线程中将可以使用相同的值 . 但是,您可以修改子线程中的线程本地值,但不会影响父线程的线程本地值 .

    使用线程本地时要小心 . 如果您正在使用线程池,则必须在正确的时间清除线程本地 . 否则将发生线程本地泄漏 .

相关问题