Java單線程ThreadLocal串值問題解決方案
ThreadLocal
ThreadLocal 適用于變量在線程間隔離,而在方法或類間共享的場(chǎng)景。
代碼
@RestController public 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才對(duì),為什么第二次運(yùn)行卻讀取到了第一次的值呢?
只是因?yàn)槲覀兊膖ocat會(huì)開啟一個(gè)線程來調(diào)用我們的程序,而tomcat本身是有線程池的,會(huì)出現(xiàn)線程復(fù)用的情況。所以導(dǎo)致了問題。
修復(fù)
@RestController public 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)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java ThreadLocal有什么作用你知道嗎
- Java ThreadLocal原理解析以及應(yīng)用場(chǎng)景分析案例詳解
- java并發(fā)編程之ThreadLocal詳解
- java中ThreadLocal的基本原理
- 面試官:java ThreadLocal真的會(huì)造成內(nèi)存泄露嗎
- 詳解Java中的ThreadLocal
- Java中的ThreadLocal功能演示示例
- Java中ThreadLocal的一些理解
- java中ThreadLocal取不到值的兩種原因
- java中ThreadLocalRandom的使用詳解
- JAVA開發(fā)常用類庫UUID、Optional、ThreadLocal、TimerTask、Base64使用方法與實(shí)例詳解
- Java中的ThreadLocal詳解
相關(guān)文章
Kotlin開發(fā)Android應(yīng)用實(shí)例詳解
這篇文章主要介紹了Kotlin開發(fā)Android應(yīng)用實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05java的Array,List和byte[],String相互轉(zhuǎn)換的方法你了解嘛
這篇文章主要為大家詳細(xì)介紹了java的Array,List和byte[],String相互轉(zhuǎn)換的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02基于javaMybatis存進(jìn)時(shí)間戳的問題
這篇文章主要介紹了javaMybatis存進(jìn)時(shí)間戳的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java多線程之并發(fā)編程的基石CAS機(jī)制詳解
這篇文章主要介紹了java并發(fā)編程之cas詳解,涉及cas使用場(chǎng)景和cas用作原子操作等內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下2021-09-09使用java + OpenCV破解頂象面積驗(yàn)證碼的示例
這篇文章主要介紹了使用java + OpenCV破解頂象面積驗(yàn)證碼的示例,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02Java實(shí)現(xiàn)等待所有子線程結(jié)束后再執(zhí)行一段代碼的方法
這篇文章主要介紹了Java實(shí)現(xiàn)等待所有子線程結(jié)束后再執(zhí)行一段代碼的方法,涉及java多線程的線程等待與執(zhí)行等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08Java替換中使用正則表達(dá)式實(shí)現(xiàn)中間模糊匹配的方法
今天小編就為大家分享一篇Java替換中使用正則表達(dá)式實(shí)現(xiàn)中間模糊匹配的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07mybatis if test 不為空字符串或null的解決
這篇文章主要介紹了mybatis if test 不為空字符串或null的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11