線程安全策略(二)——線程封閉

參考
線程封閉

線程封閉

把對象封裝到一個線程里,只有這一個線程能看到這個對象(即使這個對象不是線程安全的也不會出現(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();
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容