之前看了一些ThreadLocal的源码理解,小总结,有错误忘指出!
ThreadLocal,即一个线程变量,是一个以ThreadLocal对象为键,任意对象为值的存储结构。
ThreadLocal类中有一个名为ThreadLocalMap的内部类,该内部类中有一个Entry[] table的数组,每一个Entry存放一个键值对(ThreadLocal对象为键,任意对象为值)。
Thread类中有一个ThreadLocalMap类型,名为threadLocals的变量,用于存储线程需要私有的资源,举个例子
public class Test {
public static void main(String[] args) {
MyRunnable sharedRunnableInstance = new MyRunnable();
Thread thread1 = new Thread(sharedRunnableInstance);
Thread thread2 = new Thread(sharedRunnableInstance);
thread1.start();
thread2.start();
try {
thread1.join(); //wait for thread 1 to terminate
thread2.join(); //wait for thread 2 to terminate
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
class MyRunnable implements Runnable {
private ThreadLocal<Integer> threadLocal =
new ThreadLocal<Integer>();
@Override
public void run() {
threadLocal.set( (int) (Math.random() * 100D) );
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
System.out.println(threadLocal.get());
}
}
thread1 中的 threadLocals变量的 Entry[] table 数组只有一个Entry元素,其键为thread1中创建的threadLocal对象 ,值为一个thread1线程中创建的一个随机值。thread2线程一样的。