在线程能否获取父线程的ThreadLocal里面的值,肯定点,能
记一次面试经历,红枣科技 的面试官问我一个问题,如标题,我说是能获取的,完全可以通过反射的机制获取,当时面试官说不能获取,我说为什么不能获取,他说有隔离,问是如何隔离的,他说是不能访问的,我也没好在往下说。搞得我都不肯定了,因为可能有俺不了解的隔离机制,后来自己试了一下自己的思路,那么答案是显而易见的,是完全可以访问的。代码如下
@Test
public void test() throws InterruptedException {
ThreadLocal<Object> objectThreadLocal = new ThreadLocal<>();
objectThreadLocal.set("weijinhao");
Thread parent = Thread.currentThread();
Thread test = new Thread(new Runnable() {
@Override
public void run() {
try {
Field threadLocals = parent.getClass().getDeclaredField("threadLocals");
threadLocals.setAccessible(true);
Object o = threadLocals.get(parent);
Method getEntry = o.getClass().getDeclaredMethod("getEntry", ThreadLocal.class);
getEntry.setAccessible(true);
Object invoke = getEntry.invoke(o, objectThreadLocal);
Field value = invoke.getClass().getDeclaredField("value");
value.setAccessible(true);
String s = (String) value.get(invoke);
System.out.println(s);
} catch (Exception e) {
System.out.println(e);
}
}
});
test.start();
test.join();
}
结果一出瞬间自信了不少,面试官显然是没看到没有看过我的另一篇文章,ThreadLocal学习_奋斗的小面包的博客-CSDN博客,好了不管面试结果如何,只能这样啦!