InheritableThreadLocal代码

public class InheritableThreadLocal<T> extends ThreadLocal<T> {
protected T childValue(T parentValue) {
return parentValue;
}
ThreadLocalMap getMap(Thread t) {
return t.inheritableThreadLocals;
}
void createMap(Thread t, T firstValue) {
t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue);
}
}

测试代码

import java.util.concurrent.atomic.AtomicInteger;

/**
* Created by hujunzheng on 2017/6/23.
*/ class ThreadCount {
private static final AtomicInteger nextId = new AtomicInteger(0);
private static final ThreadLocal<Integer> threadCount =
ThreadLocal.withInitial(() -> nextId.getAndIncrement());//返回的是重写了ThreadLocal initialValue()方法的ThreadLocal.SuppliedThreadLocal对象 public static int get() {
return threadCount.get();
}
} class ThreadSign {
private static final AtomicInteger nextId = new AtomicInteger(0);
private static final ThreadLocal<Integer> threadCount = new InheritableThreadLocal<Integer>() {
@Override
protected Integer initialValue() {
return nextId.getAndIncrement();
}
}; public static int get() {
return threadCount.get();
}
} public class ThreadLocalTest { public static void testThreadLocal() {
for (int i = 0; i < 5; ++i) {
int pi = i;
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " count->" + ThreadCount.get());
for (int j = 0; j < 5; ++j) {
new Thread(() -> System.out.println(" " + Thread.currentThread().getName() + " count->" + ThreadCount.get()), "cthread" + j + " pthread" + pi).start();
}
}, "pthread" + i).start();
}
} public static void testInheritableThreadLocal() {
for(int i=0; i<5; ++i) {
int pi = i;
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " sign->" + ThreadSign.get());
for(int j=0; j<5; ++j) {
new Thread(() -> System.out.println(" " + Thread.currentThread().getName() + " sign->" + ThreadSign.get()), "cthread" + j + " pthread" + pi).start();
}
}, "pthread" + i).start();
}
} public static void main(String[] args) {
// testThreadLocal();
testInheritableThreadLocal();
}
}

测试结果

  分别为testThreadLocal() 和 testInheritableThreadLocal() 测试结果。

    

  比较后,看到ThreadLocal里的值,子线程里不能获得;InheritableThreadLocal里的值,子线程可以获得。

  

跟踪一下代码

  

参考

  Java8增加功能--Effectively final 功能

最新文章

  1. mybatis, spring, springmvc
  2. 详解spring 每个jar的作用
  3. Android缓存学习入门
  4. IplImage, CvMat, Mat 的关系
  5. Windows操作系统消费者价值亮点
  6. 实验四 时序逻辑电路的VHDL设计
  7. hdu 2047
  8. 网易音乐API
  9. 关于java异常的一点思考
  10. SQLSERVER中返回修改后的数据
  11. c# serialport读取不限数量的16进制数据
  12. Android游戏开发研究帧动画实现
  13. ●BZOJ 3994 [SDOI2015]约数个数和
  14. TypeError: parse() got an unexpected keyword argument &#39;transport_encoding&#39;
  15. tesseract 中文二次训练
  16. eigen 笔记1
  17. codeforces 766E Mahmoud and a xor trip
  18. 2018.08.31 10:57 swift 学习心得
  19. Qt跨线程调用错误解析及解决办法
  20. MyISAM重启之后的一次血泪教训

热门文章

  1. wps相关问题
  2. DNS ------ windows执行DNS过程
  3. linux sed文本
  4. 贪心算法: Codevs 1052 地鼠游戏
  5. CIKM Competition数据挖掘竞赛夺冠算法陈运文
  6. Rime中州韵导入QQ五笔词库
  7. Algorithm(1) - Karatsuba multiplication
  8. tf.Session()和tf.InteractiveSession()的区别
  9. 关于如何在Python中使用静态、类或抽象方法的权威指南
  10. CF359B Permutation (构造)