场景:
1、在java业务类中当我们定义一个全局变量,这个全局变量会被不同方法使用,并且不同线程对该变量更改、读取其值,存在并发问题
2、因为有可能本次线程赋值后还没处理完业务,后续的线程已经把变量值改掉,那么这时候本次线程拿到的就是其他线程赋的值,这个时候会出现并发问题,导致变量值混乱
3、此问题可以使用自定义局部变量中转处理解决,也可以使用 ThreadLocal、JVM锁(ReentrantLock)、分布式锁(Redisson) 来解决
分析:
1、因为在java中,Spring加载并生产JavaBean给到容器管理的实例默认都是单例模式,所以全局变量只会在生成Bean的时候初始化一次,后续业务线程每次请求全局变量都不会再初始化
2、而方法内部的局部变量正好是符合每次请求线程进来,局部变量都会再次初始化成一个新的变量并重新赋值,所以用局部变量也可以解决此并发问题
3、那么在什么地方使用ThreadLocal呢? 什么变量是请求公用的就将该变量托付给ThreadLocal来管理其线程副本。(当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本&#x