Singleton bean与ThreadLocal变量行为

时间:2017-11-26 17:19:01

标签: java spring multithreading spring-boot

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

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

@Service
class A{

 private InheritableThreadLocal<Student> student;

}

1 个答案:

答案 0 :(得分:1)

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

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

  

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

请注意,在这里您使用了void TreeType::Function() { Queue<TreeNode*> q; TreeNode* node; if (root!= NULL) { q.Enqueue(root); do { q.Dequeue(node); cout << node->info << endl; if (node->left) { q.Enqueue(node->left); } if (node->right) { q.Enqueue(node->right); } while (!q.IsEmpty()); } 并根据其java doc

  

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

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

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