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变量只有自己操作,互不干扰。