ThreadLocal和InheritableThreadLocal区别,可以用代码测试一下:
package com.lang;
import junit.framework.TestCase;
import static java.lang.System.out;
public class TestInheritableThreadLocal extends TestCase {
public void testThreadLocal() {
final ThreadLocal<String> local = new ThreadLocal<String>();
work(local);
}
public void testInheritableThreadLocal() {
final ThreadLocal<String> local = new InheritableThreadLocal<String>();
work(local);
}
private void work(final ThreadLocal<String> local) {
local.set("a");
out.println(Thread.currentThread() + "," + local.get());
Thread t = new Thread(new Runnable() {
@Override
public void run() {
out.println(Thread.currentThread() + "," + local.get());
local.set("b");
out.println(Thread.currentThread() + "," + local.get());
}
});
t.start();
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
out.println(Thread.currentThread() + "," + local.get());
}
}
运行testThreadLocal,输出:
Thread[main,5,main],a
Thread[Thread-0,5,main],null
Thread[Thread-0,5,main],b
Thread[main,5,main],a
运行testInheritableThreadLocal,输出:
Thread[main,5,main],a
Thread[Thread-0,5,main],a
Thread[Thread-0,5,main],b
Thread[main,5,main],a
比较后,看到ThreadLocal里的值,子线程里不能获得;InheritableThreadLocal里的值,子线程可以获得。