Spring 使用ThreadLocal 解决线程安全问题

Spring 中的 一些bean, 如 RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder 等非线程安全的“状态性对象”采用ThreadLocal进行封装,让他们也称为线程安全的“状态性对象”,因此有状态的bean就能够以singleton的方式在多线程环境中正常工作。

一般的Web应用划分为展现层、服务层 和 持久层2个层次,在不同的层中编写对应的逻辑,下层通过接口向上层开放功能调用。在一般情况下,从接收请求到返回响应所经过的所有程序都同属一个线程,如下图所示:

Spring 使用ThreadLocal 解决线程安全问题_第1张图片

这样用户就可以根据需要,将一些非 线程安全的变量以 ThreadLocal存放,在同一次请求响应的调用线程中,所有对象所访问的同一ThreadLocal变量都是当前线程所绑定的。

你可能感兴趣的:(Spring)