ThreadLocal是依赖于线程的

ThreadLocal是依赖于线程的!
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.locks.*;
import java.io.*;
public   class  Test1 implements Runnable{
	static ThreadLocal<Integer> t=new ThreadLocal<Integer>(){
		@Override
		protected synchronized Integer initialValue(){
			return new Integer(0);
		}
	};
	static int count=0;
	final int id=count++;
	public Test1(){
		t.set((Integer)id);//这个执行了嘛?
		System.out.println("Constructor:"+id);
	}
	public void run(){
		t.set(t.get()+1);
		System.out.println(t.get());
		
	}
	public static void main(String[] args){
		ExecutorService exec=Executors.newCachedThreadPool();
		for (int i=0;i<5;i++)
			exec.execute(new Test1());
		exec.shutdownNow();
	
	}
}


ThreadLocal是依赖于线程的,会为每个线程分配独立的空间,即使A线程上的X任务完成,如果A继续执行Y任务的话,这个分配出来的空间依旧存在并且延用。我做一些实验时候发现的可能会一不小心就出错的地方。
其输出为,
Constructor:0
Constructor:1
Constructor:2
Constructor:3
Constructor:4
1
1
1
1
1

t.set((Integer)id);这个放在构造器中,可能很直观认为,在run中输出为每个任务id+1;可是实际输出为1,即初始化ThreadLocal值以后并没有对t进行set操作。这就是因为,在构造Test1时候并没有为这个Test1的实例分配线程,所以自然不存在ThreadLocal的分配空间啦