Java單線程ThreadLocal串值問題解決方案
ThreadLocal
ThreadLocal 適用于變量在線程間隔離,而在方法或類間共享的場景。
代碼
@RestControllerpublic class ThreadLocalController { private static final ThreadLocal<String> currentUid = ThreadLocal.withInitial(() -> null); @GetMapping('bad') public Map doBad(@RequestParam('uid') String uid) { String before = currentUid.get(); currentUid.set(uid); String after = currentUid.get(); Map result = new HashMap(); result.put('before', before); result.put('after', after); return result; }}
在application中做一下tomcat的配置
server.tomcat.max-threads=1
運行結(jié)果第一次
第二次
按理說before總是null才對,為什么第二次運行卻讀取到了第一次的值呢?
只是因為我們的tocat會開啟一個線程來調(diào)用我們的程序,而tomcat本身是有線程池的,會出現(xiàn)線程復(fù)用的情況。所以導(dǎo)致了問題。
修復(fù)
@RestControllerpublic class ThreadLocalController { private static final ThreadLocal<String> currentUid = ThreadLocal.withInitial(() -> null); @GetMapping('good') public Map doGood(@RequestParam('uid') String uid) { try { String before = currentUid.get(); currentUid.set(uid); String after = currentUid.get(); Map result = new HashMap(); result.put('before', before); result.put('after', after); return result; } finally { currentUid.remove(); } }}
Key
tomcat線程池。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. Python 的 __str__ 和 __repr__ 方法對比2. IntelliJ IDEA設(shè)置默認(rèn)瀏覽器的方法3. Spring security 自定義過濾器實現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù)(實例代碼)4. IntelliJ IDEA設(shè)置背景圖片的方法步驟5. docker /var/lib/docker/aufs/mnt 目錄清理方法6. Python TestSuite生成測試報告過程解析7. 學(xué)python最電腦配置有要求么8. JAMon(Java Application Monitor)備忘記9. Python Scrapy多頁數(shù)據(jù)爬取實現(xiàn)過程解析10. Python OpenCV去除字母后面的雜線操作
