别在生产环境用这段代码——但它能让父子线程共享 ThreadLocal

31 阅读1分钟

Thread的inheritableThreadLocals提供了线程共享数据的机制,但是其只是在线程创建时,拷贝父线程的集合的副本,后续父线程修改,其数据仍然无法共享,我想着通过继承Thread改下构造函数逻辑实现真正数据共享 也就是指向同一个集合罢了 源码在下面,本来没想着用反射 但这个字段是缺省的 最后用反射搞了一下 jdk9以上是搞不了的 一些重要的类(包括Thread)用反射会报错 查了一下ai他说通过jvm参数设置可以调 使得不会报错

不知道这个东西有没有实际意义hh

class MyThread extends Thread{

       public MyThread(Runnable target) throws NoSuchFieldException, IllegalAccessException {
           super(target);
           //获取Thread类的类对象
           Field field = Thread.class.getDeclaredField("inheritableThreadLocals");
           Class<? extends MyThread> clazz= this.getClass();
           Thread parents= Thread.currentThread();
           field.setAccessible(true);
           Object parentsMap= field.get(parents);
           field.set(this,parentsMap);
           field.setAccessible(false);
       }
   }

题目是让ai起的吸引眼球的标题