java中ThreadLocal取不到值的兩種原因
1.兩種原因
第一種,也是最常見的一種,就是多個(gè)線程使用ThreadLocal
第二種,類加載器不同造成取不到值,本質(zhì)原因就是不同類加載器造成多個(gè)ThreadLocal對(duì)象
public class StaticClassLoaderTest {
protected static final ThreadLocal<Object> local = new ThreadLocal<Object>();
//cusLoader加載器加載的對(duì)象
private Test3 test3;
public StaticClassLoaderTest() {
try {
test3 = (Test3) Class.forName("gittest.Test3", true, new cusLoader()).newInstance();
}
catch (Exception e) {
e.printStackTrace();
}
}
public Test3 getTest3() {
return test3;
}
public static void main(String[] args) {
try {
//默認(rèn)類加載器加載StaticClassLoaderTest,并設(shè)置值
StaticClassLoaderTest.local.set(new Object());
new StaticClassLoaderTest().getTest3();
}
catch (Exception e) {
e.printStackTrace();
}
}
//自定義類加載器
public static class cusLoader extends ClassLoader {
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
if (name.contains("StaticClassLoaderTest")) {
InputStream is = Thread.currentThread().getContextClassLoader()
.getResourceAsStream(name.replace(".", "/") + ".class");
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
IOUtils.copy(is, output);
return defineClass(output.toByteArray(), 0, output.toByteArray().length);
}
catch (IOException e) {
e.printStackTrace();
}
}
return super.loadClass(name, resolve);
}
}
}
public class Test3 {
public void test() {
//由cusLoader加載器加載StaticClassLoaderTest,并獲取值,由于StaticClassLoaderTest并不相同所以無法獲取到值
System.out.println(StaticClassLoaderTest.local.get());
}
}
2.總結(jié)
2個(gè)累加器加載的對(duì)象引用了相同的靜態(tài)變量ThreadLocal,實(shí)際上ThreadLocal并不是同一個(gè)值,所以即使在一個(gè)線程中也獲取不到期望的值。
像依賴注入,如果你自己創(chuàng)建了一個(gè)對(duì)象,然后用手動(dòng)注入了一個(gè)容器創(chuàng)建的依賴,假設(shè)這個(gè)依賴是自定義類加器創(chuàng)建的,可能會(huì)造成這種情況。
到此這篇關(guān)于java中ThreadLocal取不到值的兩種原因的文章就介紹到這了,更多相關(guān)java ThreadLocal取不到值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 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ā)常用類庫(kù)UUID、Optional、ThreadLocal、TimerTask、Base64使用方法與實(shí)例詳解
- Java中的ThreadLocal詳解
相關(guān)文章
Java多線程場(chǎng)景解析volatile和AtomicLong區(qū)別原理
這篇文章主要為大家介紹了Java中volatile和AtomicLong的區(qū)別原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
jmeter添加自定義擴(kuò)展函數(shù)之圖片base64編碼示例詳解
這篇文章主要介紹了jmeter添加自定義擴(kuò)展函數(shù)之圖片base64編碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
java實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
探究springboot中的TomcatMetricsBinder
springboot的TomcatMetricsBinder主要是接收ApplicationStartedEvent然后創(chuàng)建TomcatMetrics執(zhí)行bindTo進(jìn)行注冊(cè),TomcatMetrics主要注冊(cè)了globalRequest、servlet、cache、threadPool、session相關(guān)的指標(biāo),本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-11-11
feign實(shí)現(xiàn)傳遞參數(shù)的三種方式小結(jié)
這篇文章主要介紹了feign實(shí)現(xiàn)傳遞參數(shù)的三種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Eclipse連接Mysql數(shù)據(jù)庫(kù)操作總結(jié)
這篇文章主要介紹了Eclipse連接Mysql數(shù)據(jù)庫(kù)操作總結(jié)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
logback-spring.xml的內(nèi)容格式詳解
這篇文章主要介紹了logback-spring.xml的內(nèi)容格式詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的的朋友參考下吧2023-11-11

