ThreadLocal使用注意


ThreadLocal<T>的出現是一種空間換時間的思想的運用,是為了多線程環境下單線程內變量共享的問題。它的原理就是每個線程通過ThreadLocal.ThreadLocalMap,保存當前線程中所有ThreadLocal變量引用的key和值。相當於每個線程有各自的變量副本,線程內共享這個變量數據,線程間互不影響。

ThreadLocal<T>有它自己的使用場景,比如Spring中用它了解決Session、Connection等多線程並發訪問問題,但不能它不能用來代替為了解決多線程安全問題的同步關鍵字,因為它實際上沒有多線程間的變量共享,而線程安全問題是指多線程間變量共享,且共享變量可修改,進而可能會出現多線程並發修改共享變量的問題,這種需要通過同步手段解決。

ThreadLocal<T>變量一般要聲名成static類型,即當前線程中只有一個T類型變量的實例,線程內可共享該實例數據且不會出問題,如將其聲名成非static,則一個線程內就存儲多個T類型變量的實例,有點存儲空間的浪費,一般很少有這樣的應用場景。另外根據實際情況,ThreadLocal變量聲名時也多加上private final關鍵詞表明它時類內私有、引用不可修改。

在線程池環境下,由於線程是一直運行且復用的,使用ThreadLocal<T>時會出現這個任務看到上個任務ThreadLocal變量值以及內存泄露等問題,解決方法就是在當前任務執行完后將ThreadLocal變量remove或設置為初始值,類似在Struts2 框架中Filter里的處理方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM