這篇文章主要為大家展示了解決Java單線程ThreadLocal串值問(wèn)題,內(nèi)容簡(jiǎn)而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會(huì)有收獲的,下面讓小編帶大家一起來(lái)看看吧。
創(chuàng)新互聯(lián)公司專注于網(wǎng)站建設(shè)|成都網(wǎng)站維護(hù)公司|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計(jì)與制作經(jīng)驗(yàn),為許多企業(yè)提供了網(wǎng)站定制設(shè)計(jì)服務(wù),案例作品覆蓋廣告推廣等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷(xiāo)售的產(chǎn)品,結(jié)合品牌形象的塑造,量身開(kāi)發(fā)品質(zhì)網(wǎng)站。
ThreadLocal
ThreadLocal 適用于變量在線程間隔離,而在方法或類(lèi)間共享的場(chǎng)景。
代碼
@RestController public class ThreadLocalController { private static final ThreadLocalcurrentUid = 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é)果第一次
第二次
按理說(shuō)before總是null才對(duì),為什么第二次運(yùn)行卻讀取到了第一次的值呢?
只是因?yàn)槲覀兊膖ocat會(huì)開(kāi)啟一個(gè)線程來(lái)調(diào)用我們的程序,而tomcat本身是有線程池的,會(huì)出現(xiàn)線程復(fù)用的情況。所以導(dǎo)致了問(wèn)題。
修復(fù)
@RestController public class ThreadLocalController { private static final ThreadLocalcurrentUid = 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線程池。
以上就是關(guān)于解決Java單線程ThreadLocal串值問(wèn)題的內(nèi)容,如果你們有學(xué)習(xí)到知識(shí)或者技能,可以把它分享出去讓更多的人看到。