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
運(yùn)行結(jié)果第一次

第二次

按理說before總是null才對,為什么第二次運(yùn)行卻讀取到了第一次的值呢?
只是因?yàn)槲覀兊膖ocat會開啟一個線程來調(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. idea重置默認(rèn)配置的方法步驟2. IntelliJ IDEA安裝插件的方法步驟3. Docker 部署 Prometheus的安裝詳細(xì)教程4. 通過Django Admin+HttpRunner1.5.6實(shí)現(xiàn)簡易接口測試平臺5. IntelliJ IDEA設(shè)置自動提示功能快捷鍵的方法6. IntelliJ IDEA設(shè)置背景圖片的方法步驟7. idea設(shè)置代碼格式化的方法步驟8. idea給項(xiàng)目打war包的方法步驟9. idea打開多個窗口的操作方法10. IntelliJ IDEA調(diào)整字體大小的方法

網(wǎng)公網(wǎng)安備