Spring容器中的bean默认是单例模式。当多个客户端同时请求一个服务时,容器会给每一个请求分配一个线程。这些线程会并发执行该请求对应的业务处理逻辑(成员方法),如果该处理逻辑中有对该单例bean状态的修改(体现为该单例bean的成员属性),则需要考虑线程同步问题。
S
pring使用ThreadLocal解决线程安全问题。一般情况下,只有无状态的Bean才可以在多线程环境下共享。Spring对一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中“非线程安全状态”,采用ThreadLocal进行处理,让它们也成为线程安全的状态,因此有状态的Bean也可以在多线程中共享了。
ThreadLocal和线程同步机制