ThreadLocal俗称线程变量,是为解决多线程程序的并发问题而提出的。与一般变量的区别在于它的生命周期是线程范围。
如果把ThreadLocal申明成静态static类型,那会怎么样呢,是否会影响它原来的作用域?
看下面测试代码:
public class ThreadLocalTest { private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() { public Integer initialValue() { return 0; } }; public int getNextNum() { threadLocal.set(threadLocal.get() + 1); return threadLocal.get(); } public static void main(String[] args) { ThreadLocalTest threadLocalTest = new ThreadLocalTest(); ThreadTest t1 = new ThreadTest(threadLocalTest); ThreadTest t2 = new ThreadTest(threadLocalTest); ThreadTest t3 = new ThreadTest(threadLocalTest); t1.start(); t2.start(); t3.start(); t1.print(); t2.print(); t3.print(); } private static class ThreadTest extends Thread { private ThreadLocalTest threadLocalTest; public ThreadTest(ThreadLocalTest threadLocalTest) { this.threadLocalTest = threadLocalTest; } public void run() { for (int i = 0; i < 3; i++) { System.out.println(Thread.currentThread().getName() + " = " + threadLocalTest.getNextNum()); } } public void print() { for (int i = 0; i < 3; i++) { System.out.println(Thread.currentThread().getName() + " = " + threadLocalTest.getNextNum()); } } } }
运行后输出如下:
main = 1
main = 2
main = 3
main = 4
main = 5
main = 6
main = 7
main = 8
main = 9
Thread-0 = 1
Thread-0 = 2
Thread-0 = 3
Thread-2 = 1
Thread-2 = 2
Thread-2 = 3
Thread-1 = 1
Thread-1 = 2
Thread-1 = 3
可见,就算把ThreadLocal申明成static的静态变量,也是一个与线程相关的静态变量,即在一个线程内共享,在不同的线程内还是隔开的。