java中ThreadLocal取不到值的两种原因
作者:WZTTMoon
这篇文章主要介绍了java中ThreadLocal取不到值的两种原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
1.两种原因
第一种,也是最常见的一种,就是多个线程使用ThreadLocal
第二种,类加载器不同造成取不到值,本质原因就是不同类加载器造成多个ThreadLocal对象
public class StaticClassLoaderTest { protected static final ThreadLocal<Object> local = new ThreadLocal<Object>(); //cusLoader加载器加载的对象 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 { //默认类加载器加载StaticClassLoaderTest,并设置值 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.总结
2个累加器加载的对象引用了相同的静态变量ThreadLocal,实际上ThreadLocal并不是同一个值,所以即使在一个线程中也获取不到期望的值。
像依赖注入,如果你自己创建了一个对象,然后用手动注入了一个容器创建的依赖,假设这个依赖是自定义类加器创建的,可能会造成这种情况。
到此这篇关于java中ThreadLocal取不到值的两种原因的文章就介绍到这了,更多相关java ThreadLocal取不到值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- Java ThreadLocal有什么作用你知道吗
- Java ThreadLocal原理解析以及应用场景分析案例详解
- java并发编程之ThreadLocal详解
- java中ThreadLocal的基本原理
- 面试官:java ThreadLocal真的会造成内存泄露吗
- 详解Java中的ThreadLocal
- Java中的ThreadLocal功能演示示例
- Java中ThreadLocal的一些理解
- Java单线程ThreadLocal串值问题解决方案
- java中ThreadLocalRandom的使用详解
- JAVA开发常用类库UUID、Optional、ThreadLocal、TimerTask、Base64使用方法与实例详解
- Java中的ThreadLocal详解