在java.lang.Thread类中有两个属性
ThreadLocal.ThreadLocalMap threadLocals
ThreadLocal.ThreadLocalMap inheritableThreadLocals
这里的ThreadLocalMap 类相当于一个Map,key 是 ThreadLocal 对象,value 就是存储的值。
threadLocals 里边的值是当前线程私有的,是线程安全的,threadLocals里可以存储一些对于线程安全有要求的对象,当下一次使用该线程时,threadLocals中的对象可以复用。当该线程消失之后,threadLocals 中的对象会被垃圾回收(如果对象被引用将不被回收)。
inheritableThreadLocals 中的值是可以被子线程继承的,inheritableThreadLocals 里可以存储一些允许被子线程使用的对象,下一次使用该线程并且创建子线程时,inheritableThreadLocals 中的对象可以复用。
举个栗子:
public static void main(String[] args) {
ThreadLocal<String> localString = new ThreadLocal<String>();
ThreadLocal<Long> localLong = new ThreadLocal<Long>();
ThreadLocal<String> inherLocalString = new InheritableThreadLocal <String>();
ThreadLocal<Long> inherLocalLong = new InheritableThreadLocal <Long>();
// 定义一个线程池
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(4, 10, 10L, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(512),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());
// 线程的计数器
CountDownLatch main = new CountDownLatch(12);
// 定义多线程执行的任务
Runnable runnable = new Runnable() {
@Override
public void run() {
String name = Thread.currentThread().getName();
long id = Thread.currentThread().getId();
String myString = localString.get();
String myInherString = inherLocalString.get();
Long myLong = localLong.get();
Long myInherLong = inherLocalLong.get();
if (StringUtils.isBlank(myString)) {
myString = name;
localString.set(myString);
System.out.println(name+" 线程 localString 存储 myString:"+myString);
}
if (StringUtils.isBlank(myInherString)) {
myInherString = name;
inherLocalString.set(