使用spring框架开发业务代码的时候,会把业务处理Service
类交给spring ioc
管理,最终它会是一个单例bean,为了避免线程安全问题,则不好在这些类中定义成员变量,于是我们会想到使用 ThreadLocal
包裹成一个变量。ThreadLocal
适用于变量在线程间隔离,而在方法或类间共享的场景。如果用户信息获取比较昂贵(例如需要调接口从其它微服务中查询),那么在 ThreadLocal
中缓存数据是比较合适的做法,但,这么做有可能会出现用户信息错乱的Bug。可以通过如下的方式复现:
使用springboot快速构建一个web应用程序,创建OrderController
类
@RestController
public class OrderController {
final ThreadLocal<String> userThreadLocal = ThreadLocal.withInitial(() -> null);
@Autowired(required = false)
private OrderService orderService;
@GetMapping