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的静态变量,也是一个与线程相关的静态变量,即在一个线程内共享,在不同的线程内还是隔开的。

你可能感兴趣的内容
Java序列化与static 收藏,3238 浏览
深入JDK源码之ThreadLocal类 收藏,2803 浏览
0条评论

selfly

交流QQ群:32261424
Owner