ThreadLocal和InheritableThreadLocal区别,可以用代码测试一下:
[java] view plain copy
- 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,输出:
[plain] view plain copy
- Thread[main,5,main],a
- Thread[Thread-0,5,main],null
- Thread[Thread-0,5,main],b
- Thread[main,5,main],a
运行testInheritableThreadLocal,输出:
[plain] view plain copy
- Thread[main,5,main],a
- Thread[Thread-0,5,main],a
- Thread[Thread-0,5,main],b
- Thread[main,5,main],a
比较后,看到ThreadLocal里的值,子线程里不能获得;InheritableThreadLocal里的值,子线程可以获得。