java中ThreadLocal取不到值的两种原因

这篇文章主要介绍了java中ThreadLocal取不到值的两种原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1.两种原因

第一种,也是最常见的一种,就是多个线程使用ThreadLocal

第二种,类加载器不同造成取不到值,本质原因就是不同类加载器造成多个ThreadLocal对象

public class StaticclassLoaderTest { protected static final ThreadLocal local = new ThreadLocal(); //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取不到值内容搜索编程之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程之家!

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...