线程---ThreadLocal
就是一个Map
key就是 Thread.getCurrentThread().
value就是线程需要保存的变量
ThreadLocal.set(value) 相当于 map.put(Thread.getCurrentThread(),value)
ThreadLocal.get() 相当于map.get(Thread.getCurrentThread());
使用Threadlocal的时候注意回收资源,每个线程结束前,将当前线程保存的线程变量一定删除 ThreadLocal.remove();否则容易引起内存泄露。
在一个操作系统中,线程和进程是有数量限制的,在操作系统中,确定线程和进程唯一性 的唯一条件就是线程或进程 的ID。
操作系统在回收线程或进程的时候,不是一定杀死线程或进程,在繁忙的时候,只会做清空线程或进程栈数据的操作,重复使用线程或进程。
ThreadLocal对象是放在堆内存中,是所有线程共享的。回收线程的同时,ThreadLocal可能并没有被回收,这时如果没有清除ThreadLocal的数据,而新创建的线程的Id又与之前存储过数据的线程的ID相同的话,就会取到之前线程的数据。