參考
線程封閉
線程封閉
把對象封裝到一個線程里,只有這一個線程能看到這個對象(即使這個對象不是線程安全的也不會出現(xiàn)任何線程安全的問題了,因為只能在一個線程里訪問)
實現(xiàn)線程封閉
- Ad-hoc 線程封閉:程序控制實現(xiàn),最糟糕,忽略
- 堆棧封閉:局部變量,無并發(fā)問題(簡單來說就是局部變量,比如多個線程訪問一個方法,方法中的局部變量都會被拷貝到線程的棧中,所以局部變量不會被多個線程共享,也就不會出現(xiàn)并發(fā)問題,全局變量才容易出現(xiàn)問題)
- ThreadLocal 線程封閉:特別好的封閉方法(ThreadLocal內(nèi)部維護了一個Map, Map的key是每個線程的名稱,Map的值是要封閉的對象,每個線程的對象都對應(yīng)了Map的值)
ThreadLocal 實例保存登錄用戶信息
public class RequestHolder {
private final static ThreadLocal<Long> requestHolder = new ThreadLocal<>();
/**
* 添加數(shù)據(jù)
* 在filter里將登錄用戶信息存入ThreadLocal
* 如果不使用ThreadLocal,我們會需要將request一直透傳
* @param id
*/
public static void add(Long id){
// ThreadLocal 內(nèi)部維護一個map,key為當前線程名,value為當前set的變量
requestHolder.set(id);
}
/**
* 獲取數(shù)據(jù)
* @return
*/
public static Long getId(){
return requestHolder.get();
}
/**
* 移除變量信息
* 如果不移除,那么變量不會釋放掉,會造成內(nèi)存泄漏
* 在接口處理完以后進行處理(interceptor)
*/
public static void remove(){
requestHolder.remove();
}
}