1. 程式人生 > 其它 >ThreadLocal和InheritableThreadLocal

ThreadLocal和InheritableThreadLocal

一、兩者區別:
ThreadLocal:為每一個執行緒建立一個副本,每個副本執行緒隔離。但是他不支援繼承。
InheritableThreadLocal:支援繼承。這裡的繼承不是extends,是指執行緒的繼承。也就是說新起一個執行緒可以擁有老執行緒的資料。
二、非同步執行緒把SpringSecurity當前使用者資訊context帶到子執行緒。

  1. 需要加個引數 -Dspring.security.strategy=MODE_INHERITABLETHREADLOCAL
  2. 或者增加程式碼塊
static {
              SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
    }
  1. 如果使用了執行緒池,則新增如下配置
@Bean
    public DelegatingSecurityContextAsyncTaskExecutor taskExecutor(ThreadPoolTaskExecutor delegate) {
        return new DelegatingSecurityContextAsyncTaskExecutor(delegate);
    }

為什麼要新增執行緒池
如果用的是執行緒池的話,子執行緒每次使用完,以前被賦值的使用者context不會被清理掉。而且下次再呼叫這個子執行緒的時候也不會重新設定當前父執行緒的使用者上下文。所以要給非同步執行緒加個DelegatingSecurityContextAsyncTaskExecutor