我想在另一个线程中访问线程本地变量。例如,我有一个线程对象A用于线程1,它有一个本地变量L1。还有另一个线程Thread-2,如何在Thread-2中访问L1?谢谢。
这还加上yshavit所观察到的事实,即通常情况下篡改第三方库的内部是不好的想法。
是的,您可以使用反射来实现。但您不应该这样做。正如其他人指出的那样:您很可能会破坏事物或得到意外的结果。
但纯粹为了学术演示,这个方法确实可以实现您所要求的功能:
@NotThreadSafe
Object getValueForThread(ThreadLocal<?> threadLocal, Thread thread) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, NoSuchFieldException {
Method getMap = ThreadLocal.class.getDeclaredMethod("getMap", new Class<?>[]{Thread.class});
getMap.setAccessible(true);
Object map = getMap.invoke(threadLocal, thread);
Class<?> clazz = map.getClass();
Method getEntry = clazz.getDeclaredMethod("getEntry", new Class<?>[]{ThreadLocal.class});
getEntry.setAccessible(true);
Object entry = getEntry.invoke(map, threadLocal);
Field value = entry.getClass().getDeclaredField("value");
value.setAccessible(true);
return value.get(entry);
}
或者至少,它可能会执行你的请求。由于没有可见性保证,调用此方法的线程可能会看到过期的值。所以再次强调:不要这样做。