Q:什么是本地变量(ThreadLocal)?
A:当创建多个线程时,ThreadLocal可为每个线程提供独立的变量副本,每个线程都可随意更改自己的副本且不影响其他线程。
TestThreadLocal.java
public class TestThreadLocal {
public static void main(String[] args) {
MyThreadLocal threadLocal = new MyThreadLocal();
Thread t1 = new Thread(threadLocal);
Thread t2 = new Thread(threadLocal);
Thread t3 = new Thread(threadLocal);
t1.start();
t2.start();
t3.start();
}
}
class MyThreadLocal implements Runnable{
// 当使用ThreadLocal变量时,各个线程都会存在一个ThreadLocal变量的副本,并且互不干扰
public static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(){
// 用于在每个线程第一次使用threadLocal.get()时赋初始值,如果在首次get()之前已经set(),则不会再调用该方法
@Override
protected Integer initialValue() {
return 0;
}
};
@Override
public void run() {
// threadLocal.set(0);
for (int i = 0; i < 3; i++) {
// threadLocal++; :-)
threadLocal.set(threadLocal.get() + 1);
System.out.println(Thread.currentThread().getName() + " = " + threadLocal.get());
}
}
}
结果
Thread-1 = 1
Thread-1 = 2
Thread-1 = 3
Thread-2 = 1
Thread-2 = 2
Thread-2 = 3
Thread-0 = 1
Thread-0 = 2
Thread-0 = 3
每个线程的threadLocal变量只有自己操作,互不干扰。